diff --git a/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/config/ApiCallLimiter.java b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/config/ApiCallLimiter.java new file mode 100644 index 0000000..f62593c --- /dev/null +++ b/gukyuin/pnu-update/src/main/java/com/kamco/cd/kamcoback/config/ApiCallLimiter.java @@ -0,0 +1,22 @@ +package com.kamco.cd.kamcoback.config; + +import java.util.concurrent.Callable; +import java.util.concurrent.Semaphore; +import org.springframework.stereotype.Component; + +@Component +public class ApiCallLimiter { + // 동시에 허용할 외부 API 호출 수 + private final Semaphore semaphore = new Semaphore(5); + + public T call(Callable fn) { + try { + semaphore.acquire(); + return fn.call(); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + semaphore.release(); + } + } +} diff --git a/gukyuin/status-update/.gitkeep b/gukyuin/status-update/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/gukyuin/status-update/.gradle/8.14/checksums/checksums.lock b/gukyuin/status-update/.gradle/8.14/checksums/checksums.lock new file mode 100644 index 0000000..f939e90 Binary files /dev/null and b/gukyuin/status-update/.gradle/8.14/checksums/checksums.lock differ diff --git a/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.bin b/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.bin new file mode 100644 index 0000000..7481f50 Binary files /dev/null and b/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.bin differ diff --git a/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.lock b/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.lock new file mode 100644 index 0000000..0a2b870 Binary files /dev/null and b/gukyuin/status-update/.gradle/8.14/executionHistory/executionHistory.lock differ diff --git a/gukyuin/status-update/.gradle/8.14/fileChanges/last-build.bin b/gukyuin/status-update/.gradle/8.14/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/gukyuin/status-update/.gradle/8.14/fileChanges/last-build.bin differ diff --git a/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.bin b/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.bin new file mode 100644 index 0000000..a717d64 Binary files /dev/null and b/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.bin differ diff --git a/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.lock b/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.lock new file mode 100644 index 0000000..2097bb3 Binary files /dev/null and b/gukyuin/status-update/.gradle/8.14/fileHashes/fileHashes.lock differ diff --git a/gukyuin/status-update/.gradle/8.14/fileHashes/resourceHashesCache.bin b/gukyuin/status-update/.gradle/8.14/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000..3074fb1 Binary files /dev/null and b/gukyuin/status-update/.gradle/8.14/fileHashes/resourceHashesCache.bin differ diff --git a/gukyuin/status-update/.gradle/8.14/gc.properties b/gukyuin/status-update/.gradle/8.14/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/gukyuin/status-update/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/gukyuin/status-update/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000..f9da996 Binary files /dev/null and b/gukyuin/status-update/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/gukyuin/status-update/.gradle/buildOutputCleanup/cache.properties b/gukyuin/status-update/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..fddf220 --- /dev/null +++ b/gukyuin/status-update/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Mon Feb 02 19:50:45 KST 2026 +gradle.version=8.14 diff --git a/gukyuin/status-update/.gradle/buildOutputCleanup/outputFiles.bin b/gukyuin/status-update/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000..ef2f430 Binary files /dev/null and b/gukyuin/status-update/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/gukyuin/status-update/.gradle/file-system.probe b/gukyuin/status-update/.gradle/file-system.probe new file mode 100644 index 0000000..10c140f Binary files /dev/null and b/gukyuin/status-update/.gradle/file-system.probe differ diff --git a/gukyuin/status-update/.gradle/vcs-1/gc.properties b/gukyuin/status-update/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/gukyuin/status-update/.idea/.gitignore b/gukyuin/status-update/.idea/.gitignore new file mode 100644 index 0000000..c3f502a --- /dev/null +++ b/gukyuin/status-update/.idea/.gitignore @@ -0,0 +1,8 @@ +# 디폴트 무시된 파일 +/shelf/ +/workspace.xml +# 에디터 기반 HTTP 클라이언트 요청 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/gukyuin/status-update/.idea/.name b/gukyuin/status-update/.idea/.name new file mode 100644 index 0000000..959565d --- /dev/null +++ b/gukyuin/status-update/.idea/.name @@ -0,0 +1 @@ +kamco-status-update-job \ No newline at end of file diff --git a/gukyuin/status-update/.idea/compiler.xml b/gukyuin/status-update/.idea/compiler.xml new file mode 100644 index 0000000..c3eb3ce --- /dev/null +++ b/gukyuin/status-update/.idea/compiler.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gukyuin/status-update/.idea/gradle.xml b/gukyuin/status-update/.idea/gradle.xml new file mode 100644 index 0000000..ce1c62c --- /dev/null +++ b/gukyuin/status-update/.idea/gradle.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/gukyuin/status-update/.idea/kamco-gukyuin-label.iml b/gukyuin/status-update/.idea/kamco-gukyuin-label.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/gukyuin/status-update/.idea/kamco-gukyuin-label.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/gukyuin/status-update/.idea/kamco-gukyuin-stblt.iml b/gukyuin/status-update/.idea/kamco-gukyuin-stblt.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/gukyuin/status-update/.idea/kamco-gukyuin-stblt.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/gukyuin/status-update/.idea/label-send.iml b/gukyuin/status-update/.idea/label-send.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/gukyuin/status-update/.idea/label-send.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/gukyuin/status-update/.idea/misc.xml b/gukyuin/status-update/.idea/misc.xml new file mode 100644 index 0000000..c6d45de --- /dev/null +++ b/gukyuin/status-update/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/gukyuin/status-update/.idea/modules.xml b/gukyuin/status-update/.idea/modules.xml new file mode 100644 index 0000000..135fa89 --- /dev/null +++ b/gukyuin/status-update/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/gukyuin/status-update/.idea/modules/kamco-label-send-job.main.iml b/gukyuin/status-update/.idea/modules/kamco-label-send-job.main.iml new file mode 100644 index 0000000..afc1871 --- /dev/null +++ b/gukyuin/status-update/.idea/modules/kamco-label-send-job.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/gukyuin/status-update/.idea/modules/kamco-status-update-job.main.iml b/gukyuin/status-update/.idea/modules/kamco-status-update-job.main.iml new file mode 100644 index 0000000..afc1871 --- /dev/null +++ b/gukyuin/status-update/.idea/modules/kamco-status-update-job.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/gukyuin/status-update/.idea/status-update.iml b/gukyuin/status-update/.idea/status-update.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/gukyuin/status-update/.idea/status-update.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/gukyuin/status-update/.idea/vcs.xml b/gukyuin/status-update/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/gukyuin/status-update/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/gukyuin/status-update/CODE_STYLE_SETUP.md b/gukyuin/status-update/CODE_STYLE_SETUP.md new file mode 100644 index 0000000..2c07ff5 --- /dev/null +++ b/gukyuin/status-update/CODE_STYLE_SETUP.md @@ -0,0 +1,112 @@ +# Code Style 설정 가이드 + +이 문서는 프로젝트에서 Google Java Style을 자동으로 적용하기 위한 설정 가이드입니다. + +## 자동 포맷팅 구성 + +### 1. 커밋 시점 자동 포맷팅 (Git Pre-commit Hook) + +커밋 전에 자동으로 코드를 포맷팅하고 스테이징합니다. + +**설정 완료:** `.git/hooks/pre-commit` 파일이 자동으로 실행됩니다. + +**동작 방식:** +- 커밋 시도 시 `./gradlew spotlessApply` 자동 실행 +- 스테이징된 Java 파일을 자동으로 포맷팅 +- 포맷팅된 파일을 자동으로 다시 스테이징 +- 포맷팅이 완료되면 커밋 진행 + +**장점:** +- 수동으로 `spotlessApply`를 실행할 필요 없음 +- 항상 일관된 코드 스타일 유지 +- 포맷팅 누락 방지 + +### 2. IntelliJ IDEA 저장 시점 자동 포맷팅 + +#### 방법 1: Code Style 설정 임포트 (권장) + +1. **IntelliJ IDEA 열기** +2. **Settings/Preferences** (Mac: `⌘,` / Windows: `Ctrl+Alt+S`) +3. **Editor > Code Style > Java** +4. **⚙️ (톱니바퀴)** 클릭 > **Import Scheme > IntelliJ IDEA code style XML** +5. 프로젝트 루트의 `intellij-java-google-style.xml` 파일 선택 +6. **OK** 클릭 + +#### 방법 2: 저장 시 자동 포맷팅 활성화 + + +**Option A: Actions on Save 설정** + +1. **Settings/Preferences** > **Tools > Actions on Save** +2. 다음 옵션들을 활성화: + - ✅ **Reformat code** + - ✅ **Optimize imports** + - ✅ **Rearrange code** (선택사항) +3. **Changed lines** 또는 **Whole file** 선택 +4. **OK** 클릭 + +**Option B: Save Actions Plugin 사용 (더 많은 옵션)** + +1. **Settings/Preferences** > **Plugins** +2. **Marketplace**에서 "Save Actions" 검색 및 설치 +3. **Settings/Preferences** > **Other Settings > Save Actions** +4. 다음 옵션 활성화: + - ✅ **Activate save actions on save** + - ✅ **Reformat file** + - ✅ **Optimize imports** + - ✅ **Rearrange fields and methods** (선택사항) + +### 3. Gradle Spotless Plugin 수동 실행 + +#### 코드 포맷팅 체크 +```bash +# 포맷팅 문제 확인만 (수정하지 않음) +./gradlew spotlessCheck +``` + +#### 코드 자동 포맷팅 +```bash +# 모든 Java 파일 자동 포맷팅 적용 +./gradlew spotlessApply +``` + +#### 빌드 시 자동 체크 +```bash +# 빌드 전에 자동으로 spotlessCheck 실행됨 +./gradlew build +``` + +## 코드 스타일 규칙 + +프로젝트는 **Google Java Style Guide** 기반으로 다음 규칙을 따릅니다: + +- **Indentation**: 2 spaces (탭 아님) +- **Line Length**: 180 characters +- **Line Endings**: LF (Unix-style) +- **Charset**: UTF-8 +- **Import Order**: Static imports → 빈 줄 → Regular imports +- **Braces**: 모든 if, for, while, do 문에 중괄호 필수 + +## 문제 해결 + +### Pre-commit hook이 실행되지 않는 경우 +```bash +# 실행 권한 확인 및 부여 +chmod +x .git/hooks/pre-commit +``` + +### Spotless 플러그인이 동작하지 않는 경우 +```bash +# Gradle 의존성 다시 다운로드 +./gradlew clean build --refresh-dependencies +``` + +### IntelliJ 포맷팅이 다르게 적용되는 경우 +1. `intellij-java-google-style.xml` 다시 임포트 +2. **File > Invalidate Caches** > **Invalidate and Restart** + +## 추가 정보 + +- **Google Java Style Guide**: https://google.github.io/styleguide/javaguide.html +- **Spotless Plugin**: https://github.com/diffplug/spotless +- **IntelliJ Code Style**: https://www.jetbrains.com/help/idea/code-style.html diff --git a/gukyuin/status-update/COMMON_CODE_CACHE_REDIS.md b/gukyuin/status-update/COMMON_CODE_CACHE_REDIS.md new file mode 100644 index 0000000..fbff1ee --- /dev/null +++ b/gukyuin/status-update/COMMON_CODE_CACHE_REDIS.md @@ -0,0 +1,282 @@ +# 공통코드 Redis 캐시 시스템 - DanielLee + +## 요구사항 검토 + +### 1. **API를 통해 공통코드 제공** +- **구현 완료**: `CommonCodeApiController`에서 전체 공통코드 조회 API 제공 + ``` + GET /api/code + → 모든 공통코드 조회 + ``` +- **추가 구현**: 캐시 갱신 및 상태 확인 API + ``` + POST /api/code/cache/refresh → 캐시 갱신 + GET /api/code/cache/status → 캐시 상태 확인 + ``` + +--- + +### 2. **애플리케이션 로딩시 Redis 캐시에 올리기** +- **구현 완료**: `CommonCodeCacheManager` 클래스 생성 + +#### 초기화 메커니즘 +```java +@Component +@RequiredArgsConstructor +public class CommonCodeCacheManager { + + @EventListener(ApplicationReadyEvent.class) + public void initializeCommonCodeCache() { + // 애플리케이션 완전히 시작된 후 공통코드를 Redis에 미리 로드 + List allCommonCodes = commonCodeService.getFindAll(); + // @Cacheable이 자동으로 Redis에 캐시함 + } +} +``` + +#### 동작 흐름 +1. 애플리케이션 시작 +2. Spring이 모든 Bean 생성 완료 (`ApplicationReadyEvent` 발생) +3. `CommonCodeCacheManager.initializeCommonCodeCache()` 실행 +4. `commonCodeService.getFindAll()` 호출 (DB에서 조회) +5. `@Cacheable(value = "commonCodes")` 에노테이션이 결과를 Redis에 저장 + +--- + +### 3. **공통코드 변경시 데이터 갱신** + +#### 자동 갱신 +- **등록 (CREATE)**: `@CacheEvict` → 캐시 전체 삭제 +- **수정 (UPDATE)**: `@CacheEvict` → 캐시 전체 삭제 +- **삭제 (DELETE)**: `@CacheEvict` → 캐시 전체 삭제 +- **순서 변경**: `@CacheEvict` → 캐시 전체 삭제 + +```java +@CacheEvict(value = "commonCodes", allEntries = true) +public ResponseObj save(CommonCodeDto.AddReq req) { + // 공통코드 저장 + // ↓ + // 캐시 전체 삭제 (다음 조회 시 DB에서 새로 로드) +} +``` + +#### 수동 갱신 (관리자) +```java +POST /api/code/cache/refresh +``` +- 공통코드 설정이 변경된 후 API를 호출하여 캐시를 강제 갱신 + +#### 캐시 상태 모니터링 +```java +GET /api/code/cache/status +→ 응답: { "data": 150 } // 캐시된 공통코드 150개 +``` + +--- + +## 전체 아키텍처 + +``` +┌─────────────────────────────────────────────────────────┐ +│ 클라이언트 요청 │ +└──────────────────┬──────────────────────────────────────┘ + │ + ┌──────────▼──────────┐ + │ CommonCodeApiController + └──────────┬──────────┘ + │ + ┌─────────┴──────────┐ + │ │ + ┌────▼─────┐ ┌──────▼────────────┐ + │ 조회 API │ │ 캐시 관리 API │ + │ (GET) │ │(POST, GET) │ + └────┬─────┘ └──────┬────────────┘ + │ │ + │ ┌────────▼──────────┐ + │ │CommonCodeCacheManager + │ │(캐시 초기화/갱신) │ + │ └────────┬──────────┘ + │ │ + ┌────▼─────────────────┬─▼────┐ + │ CommonCodeService │ │ + │ (@Cacheable) │ │ + │ (@CacheEvict) │ │ + └────┬──────────────────┴──────┘ + │ + ┌────▼──────────┐ + │ Redis 캐시 │ + │ (공통코드) │ + └────┬──────────┘ + │ + ┌────▼──────────┐ + │ PostgreSQL DB │ + │ (공통코드) │ + └───────────────┘ +``` + +--- + +## API 명세 + +### 1. 공통코드 조회 (캐시됨) +``` +GET /api/code + +응답: +{ + "data": [ + { + "id": 1, + "code": "STATUS", + "name": "상태", + "description": "상태 공통코드", + "used": true, + ... + }, + ... + ] +} +``` + +### 2. 공통코드 캐시 갱신 +``` +POST /api/code/cache/refresh + +응답: +{ + "data": "공통코드 캐시가 갱신되었습니다." +} +``` + +### 3. 캐시 상태 확인 +``` +GET /api/code/cache/status + +응답: +{ + "data": 150 // Redis에 캐시된 공통코드 개수 +} +``` + +--- + +## 캐시 갱신 흐름 + +### 자동 갱신 (CRUD 작업) +``` +관리자가 공통코드 등록/수정/삭제 + ↓ +CommonCodeService.save() / update() / removeCode() +(@CacheEvict 실행) + ↓ +Redis 캐시 전체 삭제 + ↓ +다음 조회 시 DB에서 새로 로드 +``` + +### 수동 갱신 (API 호출) +``` +관리자: POST /api/code/cache/refresh + ↓ +CommonCodeCacheManager.refreshCommonCodeCache() + ↓ +캐시 정리 + 새로운 데이터 로드 + ↓ +Redis 캐시 업데이트 완료 +``` + +--- + +## 성능 최적화 효과 + +| 항목 | 개선 전 | 개선 후 | +|------|--------|--------| +| **조회 속도** | DB 직접 조회 (10-100ms) | Redis 캐시 (1-5ms) | +| **DB 부하** | 매번 조회 | 캐시 미스시만 조회 | +| **네트워크 대역폭** | 높음 (DB 왕복) | 낮음 (로컬 캐시) | +| **응답 시간** | 변동적 | 일정 (캐시) | + +--- + +## 추가 기능 + +### CommonCodeUtil - 전역 공통코드 조회 +```java +@Component +public class CommonCodeUtil { + // 모든 공통코드 조회 (캐시 활용) + public List getAllCommonCodes() + + // 특정 코드로 조회 + public List getCommonCodesByCode(String code) + + // ID로 단건 조회 + public Optional getCommonCodeById(Long id) + + // 코드명 조회 + public Optional getCodeName(String parentCode, String childCode) + + // 하위 코드 조회 + public List getChildCodesByParentCode(String parentCode) + + // 코드 사용 가능 여부 확인 + public boolean isCodeAvailable(Long parentId, String code) +} +``` + +### 사용 예시 +```java +@RequiredArgsConstructor +@RestController +public class SomeController { + + private final CommonCodeUtil commonCodeUtil; + + @GetMapping("/example") + public void example() { + // 1. 모든 공통코드 조회 (캐시됨) + List allCodes = commonCodeUtil.getAllCommonCodes(); + + // 2. 특정 코드 조회 + Optional name = commonCodeUtil.getCodeName("PARENT", "CHILD"); + + // 3. 코드 사용 가능 여부 확인 + boolean available = commonCodeUtil.isCodeAvailable(1L, "NEW_CODE"); + } +} +``` + +--- + +## 완료 체크리스트 + +- Redis 캐싱 어노테이션 적용 (@Cacheable, @CacheEvict) +- 애플리케이션 로딩시 캐시 초기화 +- CRUD 작업시 자동 캐시 갱신 +- 수동 캐시 갱신 API 제공 +- 캐시 상태 모니터링 API +- 전역 공통코드 조회 유틸리티 +- 포괄적인 유닛 테스트 (12개) + +--- + +## 모니터링 + +캐시 상태를 주기적으로 모니터링: +```bash +# 캐시 상태 확인 +curl http://localhost:8080/api/code/cache/status + +# 캐시 갱신 +curl -X POST http://localhost:8080/api/code/cache/refresh +``` + +로그 확인: +``` +=== 공통코드 캐시 초기화 시작 === +✓ 공통코드 150개가 Redis 캐시에 로드되었습니다. + - [STATUS] 상태 (ID: 1) + - [TYPE] 타입 (ID: 2) + ... +=== 공통코드 캐시 초기화 완료 === +``` diff --git a/gukyuin/status-update/Dockerfile-dev b/gukyuin/status-update/Dockerfile-dev new file mode 100644 index 0000000..994ea58 --- /dev/null +++ b/gukyuin/status-update/Dockerfile-dev @@ -0,0 +1,29 @@ +# Stage 1: Build stage (gradle build는 Jenkins에서 이미 수행) +FROM eclipse-temurin:21-jre-jammy + +# GDAL 설치 +RUN apt-get update && apt-get install -y \ + gdal-bin \ + libgdal-dev \ + && rm -rf /var/lib/apt/lists/* + +ARG UID=1000 +ARG GID=1000 + +RUN groupadd -g ${GID} manager01 \ + && useradd -u ${UID} -g ${GID} -m manager01 + +USER manager01 + +# 작업 디렉토리 설정 +WORKDIR /app + +# JAR 파일 복사 (Jenkins에서 빌드된 ROOT.jar) +COPY build/libs/ROOT.jar app.jar + +# 포트 노출 +EXPOSE 8080 + +# 애플리케이션 실행 +# dev 프로파일로 실행 +ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=dev", "app.jar"] diff --git a/gukyuin/status-update/Jenkinsfile-dev b/gukyuin/status-update/Jenkinsfile-dev new file mode 100644 index 0000000..e018a11 --- /dev/null +++ b/gukyuin/status-update/Jenkinsfile-dev @@ -0,0 +1,94 @@ +pipeline { + agent any + tools { + jdk 'jdk21' + } + environment { + BRANCH = 'develop' + GIT_REPO = 'https://10.100.0.10:3210/dabeeo/kamco-dabeeo-backoffice.git' + } + + + stages { + stage('Checkout') { + steps { + checkout([ + $class: 'GitSCM', + branches: [[name: "${env.BRANCH}"]], + userRemoteConfigs: [[ + url: "${env.GIT_REPO}", + credentialsId: 'jenkins-dev-token' + ]] + ]) + } + } + stage('Get Commit Hash') { + steps { + script { + env.COMMIT_HASH = sh(script: "git rev-parse --short HEAD", returnStdout: true).trim() + echo "Current commit hash: ${env.COMMIT_HASH}" + } + } + } + + stage('Build') { + steps { + sh "./gradlew clean build -x test" + } + } + + stage('Docker Build & Deploy') { + steps { + script { + echo "Building Docker image with tag: ${env.COMMIT_HASH}" + + // IMAGE_TAG 환경변수 설정 후 docker-compose로 빌드 및 배포 + sh """ + export IMAGE_TAG=${env.COMMIT_HASH} + + # 기존 컨테이너 중지 및 제거 + docker-compose -f docker-compose-dev.yml down || true + + # 새 이미지 빌드 + docker-compose -f docker-compose-dev.yml build + + # latest 태그도 추가 + docker tag kamco-changedetection-api:${env.COMMIT_HASH} kamco-changedetection-api:latest + + # 컨테이너 시작 + docker-compose -f docker-compose-dev.yml up -d + """ + + // 헬스체크 대기 + echo "Waiting for application to be ready..." + sh """ + for i in {1..30}; do + if docker exec kamco-changedetection-api curl -f http://localhost:8080/monitor/health > /dev/null 2>&1; then + echo "✅ Application is healthy!" + docker-compose -f docker-compose-dev.yml ps + exit 0 + fi + echo "⏳ Waiting for application... (\$i/30)" + sleep 2 + done + echo "⚠️ Warning: Health check timeout, checking container status..." + docker-compose -f docker-compose-dev.yml ps + """ + } + } + } + + stage('Cleanup Old Images') { + steps { + script { + echo "Cleaning up old Docker images..." + sh """ + # Keep latest 5 images, remove older ones + docker images kamco-changedetection-api --format "{{.ID}} {{.Tag}}" | \ + grep -v latest | tail -n +6 | awk '{print \$1}' | xargs -r docker rmi || true + """ + } + } + } + } +} diff --git a/gukyuin/status-update/README.md b/gukyuin/status-update/README.md new file mode 100644 index 0000000..2a6b076 --- /dev/null +++ b/gukyuin/status-update/README.md @@ -0,0 +1,26 @@ +# GUKYUIN STATUS UPDATE + +> 국유인 등록 및 pnu 연동 후, pnu cnt + 상태 업데이트 schedule + +## 📋 프로젝트 소개 + +**status-update**는 국유인 등록 및 pnu 연동 후, pnu cnt + 상태 업데이트 schedule 입니다. + +## 🚀 시작하기 +GukYuinApiStatusJobService 의 findGukYuinPnuCntUpdate 메소드가 매일 00:00에 schedule 실행됨 + +```bash +./gradlew spotlessApply +``` +```bash +./gradlew clean build +``` +```bash +Java -jar status-update.jar \ +``` +### 필수 요구사항 + +- Java 21 (JDK 21) +- PostgreSQL 12+ (PostGIS 확장 필요) +- Gradle 8.x (또는 Gradle Wrapper 사용) +- Docker & Docker Compose (선택사항) \ No newline at end of file diff --git a/gukyuin/status-update/build.gradle b/gukyuin/status-update/build.gradle new file mode 100644 index 0000000..b0f630e --- /dev/null +++ b/gukyuin/status-update/build.gradle @@ -0,0 +1,110 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.5.7' + id 'io.spring.dependency-management' version '1.1.7' + id 'com.diffplug.spotless' version '6.25.0' +} + +group = 'com.kamco.cd' +version = '0.0.1-SNAPSHOT' +description = 'status-update' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +bootJar { + archiveFileName = "status-update.jar" +} + +jar { + enabled = false // plain.jar 안 만들기(혼동 방지) +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() + maven { url "https://repo.osgeo.org/repository/release/" } +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + runtimeOnly 'org.postgresql:postgresql' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'org.springframework.boot:spring-boot-starter-validation' + + //geometry + implementation 'com.fasterxml.jackson.core:jackson-databind' + implementation "org.geotools:gt-shapefile:30.0" + implementation "org.geotools:gt-referencing:30.0" + implementation "org.geotools:gt-geojson:30.0" + implementation 'org.locationtech.jts.io:jts-io-common:1.20.0' + implementation 'org.locationtech.jts:jts-core:1.19.0' + implementation 'org.hibernate:hibernate-spatial:6.2.7.Final' + implementation 'org.geotools:gt-main:30.0' + implementation("org.geotools:gt-geotiff:30.0") { + exclude group: "javax.media", module: "jai_core" + } + implementation 'org.geotools:gt-epsg-hsql:30.0' + + // QueryDSL JPA + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + + // Q클래스 생성용 annotationProcessor + annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' + annotationProcessor 'jakarta.annotation:jakarta.annotation-api' + annotationProcessor 'jakarta.persistence:jakarta.persistence-api' + + // actuator + implementation 'org.springframework.boot:spring-boot-starter-actuator' + + // Redis + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + + // SpringDoc OpenAPI (Swagger) + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0' + + // Apache Commons Compress for archive handling + implementation 'org.apache.commons:commons-compress:1.26.0' + + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' + implementation 'org.reflections:reflections:0.10.2' + + + implementation 'org.locationtech.jts:jts-core:1.19.0' + implementation 'org.locationtech.jts.io:jts-io-common:1.19.0' +} + +configurations.configureEach { + exclude group: 'javax.media', module: 'jai_core' +} + +tasks.named('test') { + useJUnitPlatform() +} + +// Spotless configuration for code formatting (2-space indent) +spotless { + java { + target 'src/**/*.java' + googleJavaFormat('1.19.2') // Default Google Style = 2 spaces (NO .aosp()!) + trimTrailingWhitespace() + endWithNewline() + } +} + +// Run spotlessCheck before build +tasks.named('build') { + dependsOn 'spotlessCheck' +} diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/KamcoBackApplication.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/KamcoBackApplication.class new file mode 100644 index 0000000..b6f1b43 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/KamcoBackApplication.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$AddReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$AddReq.class new file mode 100644 index 0000000..d0e2837 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$AddReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$Basic.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$Basic.class new file mode 100644 index 0000000..c7e3a9b Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$Basic.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$Clazzes.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$Clazzes.class new file mode 100644 index 0000000..a61b41f Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$Clazzes.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$CodeDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$CodeDto.class new file mode 100644 index 0000000..a7c39e0 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$CodeDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$ModifyReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$ModifyReq.class new file mode 100644 index 0000000..e2be397 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$ModifyReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$OrderReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$OrderReq.class new file mode 100644 index 0000000..95bbce9 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$OrderReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$SearchReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$SearchReq.class new file mode 100644 index 0000000..04e4c14 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto$SearchReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.class new file mode 100644 index 0000000..7eea8d4 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/NetUtils.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/NetUtils.class new file mode 100644 index 0000000..a7ef782 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/NetUtils.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/CodeDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/CodeDto.class new file mode 100644 index 0000000..53388dd Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/CodeDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/CodeExpose.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/CodeExpose.class new file mode 100644 index 0000000..14a8a8f Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/CodeExpose.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/CodeHidden.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/CodeHidden.class new file mode 100644 index 0000000..c9e70a0 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/CodeHidden.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/EnumType.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/EnumType.class new file mode 100644 index 0000000..f0d43c6 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/EnumType.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/EnumValidator.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/EnumValidator.class new file mode 100644 index 0000000..1363221 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/EnumValidator.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/Enums.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/Enums.class new file mode 100644 index 0000000..62ea942 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/Enums.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/ImageryFitStatus.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/ImageryFitStatus.class new file mode 100644 index 0000000..48c08ea Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/enums/ImageryFitStatus.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/html/HtmlEscapeDeserializer.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/html/HtmlEscapeDeserializer.class new file mode 100644 index 0000000..11f0ebf Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/html/HtmlEscapeDeserializer.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/html/HtmlUnescapeSerializer.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/html/HtmlUnescapeSerializer.class new file mode 100644 index 0000000..fc3bca1 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/html/HtmlUnescapeSerializer.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/interfaces/EnumValid.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/interfaces/EnumValid.class new file mode 100644 index 0000000..156efdb Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/interfaces/EnumValid.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/interfaces/JsonFormatDttm.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/interfaces/JsonFormatDttm.class new file mode 100644 index 0000000..63b5489 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/common/utils/interfaces/JsonFormatDttm.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/QuerydslConfig.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/QuerydslConfig.class new file mode 100644 index 0000000..11f1c1a Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/QuerydslConfig.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/RestTemplateConfig.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/RestTemplateConfig.class new file mode 100644 index 0000000..af8bfce Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/RestTemplateConfig.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$ApiResponseCode.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$ApiResponseCode.class new file mode 100644 index 0000000..2219089 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$ApiResponseCode.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$Error.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$Error.class new file mode 100644 index 0000000..d41d4bb Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$Error.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$ResponseObj.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$ResponseObj.class new file mode 100644 index 0000000..1958e9a Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto$ResponseObj.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto.class new file mode 100644 index 0000000..6eec4e3 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/api/ApiResponseDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/resttemplate/ExternalHttpClient$ExternalCallResult.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/resttemplate/ExternalHttpClient$ExternalCallResult.class new file mode 100644 index 0000000..cb23291 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/resttemplate/ExternalHttpClient$ExternalCallResult.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/resttemplate/ExternalHttpClient.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/resttemplate/ExternalHttpClient.class new file mode 100644 index 0000000..7214690 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/config/resttemplate/ExternalHttpClient.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$ApiResponseCode.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$ApiResponseCode.class new file mode 100644 index 0000000..18effd2 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$ApiResponseCode.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$Error.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$Error.class new file mode 100644 index 0000000..4aec570 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$Error.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$ResponseObj.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$ResponseObj.class new file mode 100644 index 0000000..b60f2a2 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto$ResponseObj.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto.class new file mode 100644 index 0000000..7e26f32 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/dto/ApiResponseDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/ApiConfigEnum$EnumDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/ApiConfigEnum$EnumDto.class new file mode 100644 index 0000000..aff3c11 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/ApiConfigEnum$EnumDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/ApiConfigEnum.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/ApiConfigEnum.class new file mode 100644 index 0000000..fad51ec Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/ApiConfigEnum.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/CodeDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/CodeDto.class new file mode 100644 index 0000000..b0b057c Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/CodeDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/CommonUseStatus.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/CommonUseStatus.class new file mode 100644 index 0000000..6e2f34e Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/CommonUseStatus.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/Enums.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/Enums.class new file mode 100644 index 0000000..6b9ca97 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/Enums.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/ImageryFitStatus.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/ImageryFitStatus.class new file mode 100644 index 0000000..41b8062 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/ImageryFitStatus.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/MngStateType.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/MngStateType.class new file mode 100644 index 0000000..0e02cb7 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/MngStateType.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/SyncStateType.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/SyncStateType.class new file mode 100644 index 0000000..95c1408 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/enums/SyncStateType.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ChnDetectContReqDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ChnDetectContReqDto.class new file mode 100644 index 0000000..84f1bf7 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ChnDetectContReqDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ContBasic.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ContBasic.class new file mode 100644 index 0000000..e90ae21 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ContBasic.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$DtoPnuDetectMpng.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$DtoPnuDetectMpng.class new file mode 100644 index 0000000..eff7bbc Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$DtoPnuDetectMpng.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ReqInfo.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ReqInfo.class new file mode 100644 index 0000000..4c6294b Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ReqInfo.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResReturn.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResReturn.class new file mode 100644 index 0000000..71c262e Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResReturn.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResultContDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResultContDto.class new file mode 100644 index 0000000..92b18a0 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResultContDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResultLabelDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResultLabelDto.class new file mode 100644 index 0000000..e65d3c4 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResultLabelDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResultPnuDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResultPnuDto.class new file mode 100644 index 0000000..f559ebd Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$ResultPnuDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$StbltResult.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$StbltResult.class new file mode 100644 index 0000000..6bf6277 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto$StbltResult.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.class new file mode 100644 index 0000000..3419471 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$Basic.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$Basic.class new file mode 100644 index 0000000..7274180 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$Basic.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChnDetectContDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChnDetectContDto.class new file mode 100644 index 0000000..0671c25 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChnDetectContDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChnDetectContReqDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChnDetectContReqDto.class new file mode 100644 index 0000000..34a2040 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChnDetectContReqDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChnDetectMastExcnStepDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChnDetectMastExcnStepDto.class new file mode 100644 index 0000000..3b82445 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChnDetectMastExcnStepDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChnDetectMastReqDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChnDetectMastReqDto.class new file mode 100644 index 0000000..8e7409c Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChnDetectMastReqDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChngDetectMastSearchDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChngDetectMastSearchDto.class new file mode 100644 index 0000000..c854b51 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ChngDetectMastSearchDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ErrorResDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ErrorResDto.class new file mode 100644 index 0000000..c0f8a7a Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ErrorResDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$LabelSendDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$LabelSendDto.class new file mode 100644 index 0000000..dd8bff5 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$LabelSendDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$LearnKeyDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$LearnKeyDto.class new file mode 100644 index 0000000..d968041 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$LearnKeyDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RegistResDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RegistResDto.class new file mode 100644 index 0000000..b04292c Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RegistResDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RemoveResDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RemoveResDto.class new file mode 100644 index 0000000..15e965d Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RemoveResDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ResReturn.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ResReturn.class new file mode 100644 index 0000000..52f1aa0 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ResReturn.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ResultDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ResultDto.class new file mode 100644 index 0000000..63eafbb Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$ResultDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RlbDtctDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RlbDtctDto.class new file mode 100644 index 0000000..4630579 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RlbDtctDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RlbDtctMastDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RlbDtctMastDto.class new file mode 100644 index 0000000..3f72ea2 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto$RlbDtctMastDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.class new file mode 100644 index 0000000..74c7f0e Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto$Basic.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto$Basic.class new file mode 100644 index 0000000..146747e Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto$Basic.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto$DetectMastReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto$DetectMastReq.class new file mode 100644 index 0000000..3f67bfb Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto$DetectMastReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto$DetectMastSearch.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto$DetectMastSearch.class new file mode 100644 index 0000000..bdda497 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto$DetectMastSearch.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto$FeaturePnuDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto$FeaturePnuDto.class new file mode 100644 index 0000000..3a107ed Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto$FeaturePnuDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto.class new file mode 100644 index 0000000..a3af015 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$GeomUidDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$GeomUidDto.class new file mode 100644 index 0000000..de8c574 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$GeomUidDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$GukYuinLinkFacts.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$GukYuinLinkFacts.class new file mode 100644 index 0000000..d20e653 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$GukYuinLinkFacts.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$GukYuinLinkFailCode.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$GukYuinLinkFailCode.class new file mode 100644 index 0000000..917694f Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$GukYuinLinkFailCode.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$GukYuinLinkableRes.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$GukYuinLinkableRes.class new file mode 100644 index 0000000..3ca3ada Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$GukYuinLinkableRes.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$LearnInfo.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$LearnInfo.class new file mode 100644 index 0000000..5dcb2ac Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto$LearnInfo.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto.class new file mode 100644 index 0000000..61e55f9 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinStatus.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinStatus.class new file mode 100644 index 0000000..563ca43 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinStatus.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/DetectionClassification.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/DetectionClassification.class new file mode 100644 index 0000000..3fbb835 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/DetectionClassification.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResList.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResList.class new file mode 100644 index 0000000..9777979 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResList.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResSummary.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResSummary.class new file mode 100644 index 0000000..55c29d2 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResSummary.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResultInfo.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResultInfo.class new file mode 100644 index 0000000..d861d3a Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$AnalResultInfo.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Basic.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Basic.class new file mode 100644 index 0000000..d2940c2 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Basic.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$BboxPointDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$BboxPointDto.class new file mode 100644 index 0000000..de5efd3 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$BboxPointDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazz.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazz.class new file mode 100644 index 0000000..c8f8e05 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazz.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazzes.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazzes.class new file mode 100644 index 0000000..e5d81f2 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Clazzes.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Coordinate.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Coordinate.class new file mode 100644 index 0000000..d800dfb Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Coordinate.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Dashboard.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Dashboard.class new file mode 100644 index 0000000..d476642 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Dashboard.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Detail.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Detail.class new file mode 100644 index 0000000..c12694d Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Detail.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$DetailListEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$DetailListEntity.class new file mode 100644 index 0000000..9d5a16f Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$DetailListEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Geom.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Geom.class new file mode 100644 index 0000000..3f065da Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Geom.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$InferenceBatchSheet.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$InferenceBatchSheet.class new file mode 100644 index 0000000..f63eb56 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$InferenceBatchSheet.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$MapSheet.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$MapSheet.class new file mode 100644 index 0000000..b76f82a Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$MapSheet.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Scene.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Scene.class new file mode 100644 index 0000000..05ec255 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Scene.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchGeoReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchGeoReq.class new file mode 100644 index 0000000..934dcb9 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchGeoReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchReq.class new file mode 100644 index 0000000..b7ba811 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$SearchReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Uid.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Uid.class new file mode 100644 index 0000000..3a64879 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto$Uid.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.class new file mode 100644 index 0000000..439019d Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$DetectOption.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$DetectOption.class new file mode 100644 index 0000000..e739976 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$DetectOption.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceLearnDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceLearnDto.class new file mode 100644 index 0000000..cde5541 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceLearnDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceServerStatusDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceServerStatusDto.class new file mode 100644 index 0000000..1c4db81 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceServerStatusDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceStatusDetailDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceStatusDetailDto.class new file mode 100644 index 0000000..8bc99f5 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceStatusDetailDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceStatusDetailDto2.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceStatusDetailDto2.class new file mode 100644 index 0000000..05019a9 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$InferenceStatusDetailDto2.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$MapSheetNumDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$MapSheetNumDto.class new file mode 100644 index 0000000..2adecaa Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$MapSheetNumDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$MapSheetScope.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$MapSheetScope.class new file mode 100644 index 0000000..6691bb1 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$MapSheetScope.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$RegReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$RegReq.class new file mode 100644 index 0000000..ac8df42 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$RegReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$ResultList.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$ResultList.class new file mode 100644 index 0000000..4d4b02b Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$ResultList.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$SaveInferenceAiDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$SaveInferenceAiDto.class new file mode 100644 index 0000000..a7469ea Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$SaveInferenceAiDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$SearchListReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$SearchListReq.class new file mode 100644 index 0000000..c58e061 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$SearchListReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$ServerStatus.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$ServerStatus.class new file mode 100644 index 0000000..05e10cc Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$ServerStatus.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$Status.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$Status.class new file mode 100644 index 0000000..f893367 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto$Status.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.class new file mode 100644 index 0000000..83380fa Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inferface/CodeExpose.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inferface/CodeExpose.class new file mode 100644 index 0000000..c5c9cc2 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inferface/CodeExpose.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inferface/CodeHidden.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inferface/CodeHidden.class new file mode 100644 index 0000000..ea41d29 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inferface/CodeHidden.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inferface/EnumType.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inferface/EnumType.class new file mode 100644 index 0000000..6700ff7 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inferface/EnumType.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inferface/JsonFormatDttm.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inferface/JsonFormatDttm.class new file mode 100644 index 0000000..190dc12 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/inferface/JsonFormatDttm.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$AllocateDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$AllocateDto.class new file mode 100644 index 0000000..a553955 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$AllocateDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$AllocateInfoDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$AllocateInfoDto.class new file mode 100644 index 0000000..b3249df Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$AllocateInfoDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$AllocateMoveDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$AllocateMoveDto.class new file mode 100644 index 0000000..57115ff Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$AllocateMoveDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$Basic.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$Basic.class new file mode 100644 index 0000000..ee396af Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$Basic.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$InferenceDetail.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$InferenceDetail.class new file mode 100644 index 0000000..9f2c136 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$InferenceDetail.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$InspectState.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$InspectState.class new file mode 100644 index 0000000..10a85d5 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$InspectState.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$LabelMngState.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$LabelMngState.class new file mode 100644 index 0000000..d8f3a01 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$LabelMngState.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$LabelState.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$LabelState.class new file mode 100644 index 0000000..dc99b29 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$LabelState.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$LabelerDetail.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$LabelerDetail.class new file mode 100644 index 0000000..6af39b2 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$LabelerDetail.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$LabelingStatDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$LabelingStatDto.class new file mode 100644 index 0000000..c6e7a6a Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$LabelingStatDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$MoveInfo.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$MoveInfo.class new file mode 100644 index 0000000..1acd221 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$MoveInfo.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$MoveUserList.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$MoveUserList.class new file mode 100644 index 0000000..663dcb7 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$MoveUserList.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$TargetInspector.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$TargetInspector.class new file mode 100644 index 0000000..98634ad Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$TargetInspector.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$TargetUser.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$TargetUser.class new file mode 100644 index 0000000..53dee8e Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$TargetUser.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$UserList.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$UserList.class new file mode 100644 index 0000000..7b4c74f Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$UserList.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$WorkHistoryDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$WorkHistoryDto.class new file mode 100644 index 0000000..56f3cef Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$WorkHistoryDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$searchReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$searchReq.class new file mode 100644 index 0000000..555a40d Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto$searchReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto.class new file mode 100644 index 0000000..3aeced1 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelAllocateDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelInspectorDto$Basic.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelInspectorDto$Basic.class new file mode 100644 index 0000000..1801b99 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelInspectorDto$Basic.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelInspectorDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelInspectorDto.class new file mode 100644 index 0000000..6e3b61d Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelInspectorDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelLabelerDto$Basic.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelLabelerDto$Basic.class new file mode 100644 index 0000000..be9ec1e Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelLabelerDto$Basic.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelLabelerDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelLabelerDto.class new file mode 100644 index 0000000..5a1b01d Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/label/dto/LabelLabelerDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/log/dto/EventStatus.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/log/dto/EventStatus.class new file mode 100644 index 0000000..b9a7454 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/log/dto/EventStatus.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/log/dto/EventType.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/log/dto/EventType.class new file mode 100644 index 0000000..59e1747 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/log/dto/EventType.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.class new file mode 100644 index 0000000..f649cb8 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinJobCoreService.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinJobCoreService.class new file mode 100644 index 0000000..bbb978f Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinJobCoreService.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.class new file mode 100644 index 0000000..214c087 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/CommonDateEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/CommonDateEntity.class new file mode 100644 index 0000000..e3895f9 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/CommonDateEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.class new file mode 100644 index 0000000..a2dba9c Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.class new file mode 100644 index 0000000..4018c4d Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.class new file mode 100644 index 0000000..75cc76b Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.class new file mode 100644 index 0000000..98b5812 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceEntity.class new file mode 100644 index 0000000..17a8aa6 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.class new file mode 100644 index 0000000..7294a45 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalInferenceEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalInferenceEntity.class new file mode 100644 index 0000000..6e6182b Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalInferenceEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnDataGeomEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnDataGeomEntity.class new file mode 100644 index 0000000..53eb96f Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnDataGeomEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnEntity.class new file mode 100644 index 0000000..690d141 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.class new file mode 100644 index 0000000..dbe76a0 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QCommonDateEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QCommonDateEntity.class new file mode 100644 index 0000000..bc26791 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QCommonDateEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.class new file mode 100644 index 0000000..da2e512 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.class new file mode 100644 index 0000000..44a88a7 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.class new file mode 100644 index 0000000..c263e81 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.class new file mode 100644 index 0000000..fe95f6f Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalDataInferenceEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalDataInferenceEntity.class new file mode 100644 index 0000000..30580d6 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalDataInferenceEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalDataInferenceGeomEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalDataInferenceGeomEntity.class new file mode 100644 index 0000000..399463e Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalDataInferenceGeomEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalInferenceEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalInferenceEntity.class new file mode 100644 index 0000000..0169645 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalInferenceEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetLearnDataGeomEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetLearnDataGeomEntity.class new file mode 100644 index 0000000..1484071 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetLearnDataGeomEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetLearnEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetLearnEntity.class new file mode 100644 index 0000000..9968414 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetLearnEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.class new file mode 100644 index 0000000..04c84fc Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepository.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepository.class new file mode 100644 index 0000000..9e0b29e Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepository.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.class new file mode 100644 index 0000000..e691f18 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.class new file mode 100644 index 0000000..ac376a8 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepository.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepository.class new file mode 100644 index 0000000..f7119d1 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepository.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryCustom.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryCustom.class new file mode 100644 index 0000000..b4a6030 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryCustom.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryImpl.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryImpl.class new file mode 100644 index 0000000..e4f57f1 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryImpl.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$AddMapReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$AddMapReq.class new file mode 100644 index 0000000..f29388c Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$AddMapReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$Basic.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$Basic.class new file mode 100644 index 0000000..7c5c3fd Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$Basic.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapList.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapList.class new file mode 100644 index 0000000..afee85a Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapList.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapListEntity$MapListEntityBuilder.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapListEntity$MapListEntityBuilder.class new file mode 100644 index 0000000..55035ee Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapListEntity$MapListEntityBuilder.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapListEntity.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapListEntity.class new file mode 100644 index 0000000..09c41b8 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$MapListEntity.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$Search5kReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$Search5kReq.class new file mode 100644 index 0000000..a7f4847 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$Search5kReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$UseInferReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$UseInferReq.class new file mode 100644 index 0000000..6a9be6d Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$UseInferReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$searchReq.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$searchReq.class new file mode 100644 index 0000000..911727c Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto$searchReq.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.class new file mode 100644 index 0000000..d876673 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$AnalCntInfo.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$AnalCntInfo.class new file mode 100644 index 0000000..fe3de82 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$AnalCntInfo.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$AnalMapSheetList.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$AnalMapSheetList.class new file mode 100644 index 0000000..6ca71b7 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$AnalMapSheetList.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$CompleteLabelData$GeoJsonFeature.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$CompleteLabelData$GeoJsonFeature.class new file mode 100644 index 0000000..749ef9b Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$CompleteLabelData$GeoJsonFeature.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$CompleteLabelData$Properties.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$CompleteLabelData$Properties.class new file mode 100644 index 0000000..47ab502 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$CompleteLabelData$Properties.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$CompleteLabelData.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$CompleteLabelData.class new file mode 100644 index 0000000..8a837d3 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$CompleteLabelData.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$FeatureCollection.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$FeatureCollection.class new file mode 100644 index 0000000..75f80b3 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$FeatureCollection.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$InspectorPendingDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$InspectorPendingDto.class new file mode 100644 index 0000000..131c4ee Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$InspectorPendingDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$Tasks.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$Tasks.class new file mode 100644 index 0000000..7e4f989 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto$Tasks.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto.class new file mode 100644 index 0000000..78177dd Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/scheduler/dto/TrainingDataReviewJobDto.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiService.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiService.class new file mode 100644 index 0000000..d2e40f7 Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiService.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.class new file mode 100644 index 0000000..a01b53e Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.class differ diff --git a/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/StatusUpdateRunner.class b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/StatusUpdateRunner.class new file mode 100644 index 0000000..de1e15b Binary files /dev/null and b/gukyuin/status-update/build/classes/java/main/com/kamco/cd/kamcoback/service/StatusUpdateRunner.class differ diff --git a/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QCommonDateEntity.java b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QCommonDateEntity.java new file mode 100644 index 0000000..2bb519c --- /dev/null +++ b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QCommonDateEntity.java @@ -0,0 +1,39 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QCommonDateEntity is a Querydsl query type for CommonDateEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QCommonDateEntity extends EntityPathBase { + + private static final long serialVersionUID = 1355779051L; + + public static final QCommonDateEntity commonDateEntity = new QCommonDateEntity("commonDateEntity"); + + public final DateTimePath createdDate = createDateTime("createdDate", java.time.ZonedDateTime.class); + + public final DateTimePath modifiedDate = createDateTime("modifiedDate", java.time.ZonedDateTime.class); + + public QCommonDateEntity(String variable) { + super(CommonDateEntity.class, forVariable(variable)); + } + + public QCommonDateEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QCommonDateEntity(PathMetadata metadata) { + super(CommonDateEntity.class, metadata); + } + +} + diff --git a/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.java b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.java new file mode 100644 index 0000000..52939cb --- /dev/null +++ b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingAssignmentEntity.java @@ -0,0 +1,67 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QLabelingAssignmentEntity is a Querydsl query type for LabelingAssignmentEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QLabelingAssignmentEntity extends EntityPathBase { + + private static final long serialVersionUID = -1647165171L; + + public static final QLabelingAssignmentEntity labelingAssignmentEntity = new QLabelingAssignmentEntity("labelingAssignmentEntity"); + + public final QCommonDateEntity _super = new QCommonDateEntity(this); + + public final NumberPath analUid = createNumber("analUid", Long.class); + + public final StringPath assignGroupId = createString("assignGroupId"); + + public final ComparablePath assignmentUid = createComparable("assignmentUid", java.util.UUID.class); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final NumberPath inferenceGeomUid = createNumber("inferenceGeomUid", Long.class); + + public final StringPath inspectorUid = createString("inspectorUid"); + + public final DateTimePath inspectStatDttm = createDateTime("inspectStatDttm", java.time.ZonedDateTime.class); + + public final StringPath inspectState = createString("inspectState"); + + public final NumberPath learnGeomUid = createNumber("learnGeomUid", Long.class); + + //inherited + public final DateTimePath modifiedDate = _super.modifiedDate; + + public final ComparablePath stagnationYn = createComparable("stagnationYn", Character.class); + + public final StringPath workerUid = createString("workerUid"); + + public final DateTimePath workStatDttm = createDateTime("workStatDttm", java.time.ZonedDateTime.class); + + public final StringPath workState = createString("workState"); + + public QLabelingAssignmentEntity(String variable) { + super(LabelingAssignmentEntity.class, forVariable(variable)); + } + + public QLabelingAssignmentEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QLabelingAssignmentEntity(PathMetadata metadata) { + super(LabelingAssignmentEntity.class, metadata); + } + +} + diff --git a/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.java b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.java new file mode 100644 index 0000000..d85c9e5 --- /dev/null +++ b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QLabelingInspectorEntity.java @@ -0,0 +1,49 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QLabelingInspectorEntity is a Querydsl query type for LabelingInspectorEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QLabelingInspectorEntity extends EntityPathBase { + + private static final long serialVersionUID = -1575073251L; + + public static final QLabelingInspectorEntity labelingInspectorEntity = new QLabelingInspectorEntity("labelingInspectorEntity"); + + public final QCommonDateEntity _super = new QCommonDateEntity(this); + + public final NumberPath analUid = createNumber("analUid", Long.class); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final StringPath inspectorUid = createString("inspectorUid"); + + //inherited + public final DateTimePath modifiedDate = _super.modifiedDate; + + public final ComparablePath operatorUid = createComparable("operatorUid", java.util.UUID.class); + + public QLabelingInspectorEntity(String variable) { + super(LabelingInspectorEntity.class, forVariable(variable)); + } + + public QLabelingInspectorEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QLabelingInspectorEntity(PathMetadata metadata) { + super(LabelingInspectorEntity.class, metadata); + } + +} + diff --git a/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.java b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.java new file mode 100644 index 0000000..471c2eb --- /dev/null +++ b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx50kEntity.java @@ -0,0 +1,53 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QMapInkx50kEntity is a Querydsl query type for MapInkx50kEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMapInkx50kEntity extends EntityPathBase { + + private static final long serialVersionUID = 1410103956L; + + public static final QMapInkx50kEntity mapInkx50kEntity = new QMapInkx50kEntity("mapInkx50kEntity"); + + public final QCommonDateEntity _super = new QCommonDateEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final NumberPath fid = createNumber("fid", Integer.class); + + public final ComparablePath geom = createComparable("geom", org.locationtech.jts.geom.Geometry.class); + + public final StringPath mapidcdNo = createString("mapidcdNo"); + + public final StringPath mapidNm = createString("mapidNm"); + + public final StringPath mapidNo = createString("mapidNo"); + + //inherited + public final DateTimePath modifiedDate = _super.modifiedDate; + + public QMapInkx50kEntity(String variable) { + super(MapInkx50kEntity.class, forVariable(variable)); + } + + public QMapInkx50kEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QMapInkx50kEntity(PathMetadata metadata) { + super(MapInkx50kEntity.class, metadata); + } + +} + diff --git a/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.java b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.java new file mode 100644 index 0000000..be5ad05 --- /dev/null +++ b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapInkx5kEntity.java @@ -0,0 +1,67 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMapInkx5kEntity is a Querydsl query type for MapInkx5kEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMapInkx5kEntity extends EntityPathBase { + + private static final long serialVersionUID = 372911320L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QMapInkx5kEntity mapInkx5kEntity = new QMapInkx5kEntity("mapInkx5kEntity"); + + public final QCommonDateEntity _super = new QCommonDateEntity(this); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final NumberPath fid = createNumber("fid", Integer.class); + + public final ComparablePath geom = createComparable("geom", org.locationtech.jts.geom.Geometry.class); + + public final StringPath mapidcdNo = createString("mapidcdNo"); + + public final StringPath mapidNm = createString("mapidNm"); + + public final QMapInkx50kEntity mapInkx50k; + + //inherited + public final DateTimePath modifiedDate = _super.modifiedDate; + + public final EnumPath useInference = createEnum("useInference", com.kamco.cd.kamcoback.enums.CommonUseStatus.class); + + public QMapInkx5kEntity(String variable) { + this(MapInkx5kEntity.class, forVariable(variable), INITS); + } + + public QMapInkx5kEntity(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QMapInkx5kEntity(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QMapInkx5kEntity(PathMetadata metadata, PathInits inits) { + this(MapInkx5kEntity.class, metadata, inits); + } + + public QMapInkx5kEntity(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.mapInkx50k = inits.isInitialized("mapInkx50k") ? new QMapInkx50kEntity(forProperty("mapInkx50k")) : null; + } + +} + diff --git a/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalDataInferenceEntity.java b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalDataInferenceEntity.java new file mode 100644 index 0000000..d48d257 --- /dev/null +++ b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalDataInferenceEntity.java @@ -0,0 +1,81 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QMapSheetAnalDataInferenceEntity is a Querydsl query type for MapSheetAnalDataInferenceEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMapSheetAnalDataInferenceEntity extends EntityPathBase { + + private static final long serialVersionUID = -1712290584L; + + public static final QMapSheetAnalDataInferenceEntity mapSheetAnalDataInferenceEntity = new QMapSheetAnalDataInferenceEntity("mapSheetAnalDataInferenceEntity"); + + public final StringPath analState = createString("analState"); + + public final NumberPath analUid = createNumber("analUid", Long.class); + + public final NumberPath compareYyyy = createNumber("compareYyyy", Integer.class); + + public final DateTimePath createdDttm = createDateTime("createdDttm", java.time.ZonedDateTime.class); + + public final NumberPath createdUid = createNumber("createdUid", Long.class); + + public final DateTimePath fileCreatedDttm = createDateTime("fileCreatedDttm", java.time.ZonedDateTime.class); + + public final BooleanPath fileCreatedYn = createBoolean("fileCreatedYn"); + + public final StringPath fitState = createString("fitState"); + + public final StringPath fitStateCmmnt = createString("fitStateCmmnt"); + + public final DateTimePath fitStateDttm = createDateTime("fitStateDttm", java.time.ZonedDateTime.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final NumberPath labelerUid = createNumber("labelerUid", Long.class); + + public final StringPath labelState = createString("labelState"); + + public final DateTimePath labelStateDttm = createDateTime("labelStateDttm", java.time.ZonedDateTime.class); + + public final NumberPath mapSheetNum = createNumber("mapSheetNum", Long.class); + + public final NumberPath refMapSheetNum = createNumber("refMapSheetNum", Long.class); + + public final NumberPath stage = createNumber("stage", Integer.class); + + public final NumberPath targetYyyy = createNumber("targetYyyy", Integer.class); + + public final NumberPath testerUid = createNumber("testerUid", Long.class); + + public final StringPath testState = createString("testState"); + + public final DateTimePath testStateDttm = createDateTime("testStateDttm", java.time.ZonedDateTime.class); + + public final DateTimePath updatedDttm = createDateTime("updatedDttm", java.time.ZonedDateTime.class); + + public final NumberPath updatedUid = createNumber("updatedUid", Long.class); + + public QMapSheetAnalDataInferenceEntity(String variable) { + super(MapSheetAnalDataInferenceEntity.class, forVariable(variable)); + } + + public QMapSheetAnalDataInferenceEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QMapSheetAnalDataInferenceEntity(PathMetadata metadata) { + super(MapSheetAnalDataInferenceEntity.class, metadata); + } + +} + diff --git a/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalDataInferenceGeomEntity.java b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalDataInferenceGeomEntity.java new file mode 100644 index 0000000..82eac7d --- /dev/null +++ b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalDataInferenceGeomEntity.java @@ -0,0 +1,125 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMapSheetAnalDataInferenceGeomEntity is a Querydsl query type for MapSheetAnalDataInferenceGeomEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMapSheetAnalDataInferenceGeomEntity extends EntityPathBase { + + private static final long serialVersionUID = -1600559932L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QMapSheetAnalDataInferenceGeomEntity mapSheetAnalDataInferenceGeomEntity = new QMapSheetAnalDataInferenceGeomEntity("mapSheetAnalDataInferenceGeomEntity"); + + public final NumberPath area = createNumber("area", Double.class); + + public final ComparablePath beforeGeom = createComparable("beforeGeom", org.locationtech.jts.geom.Geometry.class); + + public final NumberPath cdProb = createNumber("cdProb", Double.class); + + public final StringPath classAfterCd = createString("classAfterCd"); + + public final NumberPath classAfterProb = createNumber("classAfterProb", Double.class); + + public final StringPath classBeforeCd = createString("classBeforeCd"); + + public final NumberPath classBeforeProb = createNumber("classBeforeProb", Double.class); + + public final NumberPath compareYyyy = createNumber("compareYyyy", Integer.class); + + public final DateTimePath createdDttm = createDateTime("createdDttm", java.time.ZonedDateTime.class); + + public final NumberPath createdUid = createNumber("createdUid", Long.class); + + public final NumberPath dataUid = createNumber("dataUid", Long.class); + + public final DateTimePath fileCreatedDttm = createDateTime("fileCreatedDttm", java.time.ZonedDateTime.class); + + public final BooleanPath fileCreatedYn = createBoolean("fileCreatedYn"); + + public final StringPath fitState = createString("fitState"); + + public final StringPath fitStateCmmnt = createString("fitStateCmmnt"); + + public final DateTimePath fitStateDttm = createDateTime("fitStateDttm", java.time.ZonedDateTime.class); + + public final ComparablePath geom = createComparable("geom", org.locationtech.jts.geom.Geometry.class); + + public final ComparablePath geomCenter = createComparable("geomCenter", org.locationtech.jts.geom.Geometry.class); + + public final NumberPath geomCnt = createNumber("geomCnt", Long.class); + + public final StringPath geoType = createString("geoType"); + + public final NumberPath geoUid = createNumber("geoUid", Long.class); + + public final NumberPath labelerUid = createNumber("labelerUid", Long.class); + + public final DateTimePath labelSendDttm = createDateTime("labelSendDttm", java.time.ZonedDateTime.class); + + public final StringPath labelState = createString("labelState"); + + public final DateTimePath labelStateDttm = createDateTime("labelStateDttm", java.time.ZonedDateTime.class); + + public final StringPath lockYn = createString("lockYn"); + + public final QMapInkx5kEntity map5k; + + public final NumberPath mapSheetNum = createNumber("mapSheetNum", Long.class); + + public final NumberPath pnu = createNumber("pnu", Long.class); + + public final NumberPath refMapSheetNum = createNumber("refMapSheetNum", Long.class); + + public final StringPath resultUid = createString("resultUid"); + + public final NumberPath stage = createNumber("stage", Integer.class); + + public final NumberPath targetYyyy = createNumber("targetYyyy", Integer.class); + + public final NumberPath testerUid = createNumber("testerUid", Long.class); + + public final StringPath testState = createString("testState"); + + public final DateTimePath testStateDttm = createDateTime("testStateDttm", java.time.ZonedDateTime.class); + + public final DateTimePath updatedDttm = createDateTime("updatedDttm", java.time.ZonedDateTime.class); + + public final NumberPath updatedUid = createNumber("updatedUid", Long.class); + + public final ComparablePath uuid = createComparable("uuid", java.util.UUID.class); + + public QMapSheetAnalDataInferenceGeomEntity(String variable) { + this(MapSheetAnalDataInferenceGeomEntity.class, forVariable(variable), INITS); + } + + public QMapSheetAnalDataInferenceGeomEntity(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QMapSheetAnalDataInferenceGeomEntity(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QMapSheetAnalDataInferenceGeomEntity(PathMetadata metadata, PathInits inits) { + this(MapSheetAnalDataInferenceGeomEntity.class, metadata, inits); + } + + public QMapSheetAnalDataInferenceGeomEntity(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.map5k = inits.isInitialized("map5k") ? new QMapInkx5kEntity(forProperty("map5k"), inits.get("map5k")) : null; + } + +} + diff --git a/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalInferenceEntity.java b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalInferenceEntity.java new file mode 100644 index 0000000..57eb0b2 --- /dev/null +++ b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetAnalInferenceEntity.java @@ -0,0 +1,110 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QMapSheetAnalInferenceEntity is a Querydsl query type for MapSheetAnalInferenceEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMapSheetAnalInferenceEntity extends EntityPathBase { + + private static final long serialVersionUID = -1438711566L; + + public static final QMapSheetAnalInferenceEntity mapSheetAnalInferenceEntity = new QMapSheetAnalInferenceEntity("mapSheetAnalInferenceEntity"); + + public final NumberPath accuracy = createNumber("accuracy", Double.class); + + public final DateTimePath analEndDttm = createDateTime("analEndDttm", java.time.ZonedDateTime.class); + + public final NumberPath analPredSec = createNumber("analPredSec", Long.class); + + public final NumberPath analSec = createNumber("analSec", Long.class); + + public final StringPath analState = createString("analState"); + + public final DateTimePath analStrtDttm = createDateTime("analStrtDttm", java.time.ZonedDateTime.class); + + public final StringPath analTargetType = createString("analTargetType"); + + public final StringPath analTitle = createString("analTitle"); + + public final StringPath baseMapSheetNum = createString("baseMapSheetNum"); + + public final NumberPath compareYyyy = createNumber("compareYyyy", Integer.class); + + public final DateTimePath createdDttm = createDateTime("createdDttm", java.time.ZonedDateTime.class); + + public final NumberPath createdUid = createNumber("createdUid", Long.class); + + public final NumberPath detectingCnt = createNumber("detectingCnt", Long.class); + + public final StringPath detectingDescription = createString("detectingDescription"); + + public final StringPath detectionDataOption = createString("detectionDataOption"); + + public final DateTimePath gukyuinApplyDttm = createDateTime("gukyuinApplyDttm", java.time.ZonedDateTime.class); + + public final StringPath gukyuinUsed = createString("gukyuinUsed"); + + public final MapPath> hyperParams = this.>createMap("hyperParams", String.class, Object.class, SimplePath.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath inspectionClosedYn = createString("inspectionClosedYn"); + + public final StringPath labelingClosedYn = createString("labelingClosedYn"); + + public final NumberPath learnId = createNumber("learnId", Long.class); + + public final StringPath modelM1Ver = createString("modelM1Ver"); + + public final StringPath modelM2Ver = createString("modelM2Ver"); + + public final StringPath modelM3Ver = createString("modelM3Ver"); + + public final NumberPath modelUid = createNumber("modelUid", Long.class); + + public final NumberPath modelVerUid = createNumber("modelVerUid", Long.class); + + public final StringPath resultUrl = createString("resultUrl"); + + public final StringPath serverIds = createString("serverIds"); + + public final NumberPath stage = createNumber("stage", Integer.class); + + public final NumberPath targetYyyy = createNumber("targetYyyy", Integer.class); + + public final StringPath testRate = createString("testRate"); + + public final ListPath> tranningRate = this.>createList("tranningRate", Double.class, NumberPath.class, PathInits.DIRECT2); + + public final DateTimePath updatedDttm = createDateTime("updatedDttm", java.time.ZonedDateTime.class); + + public final NumberPath updatedUid = createNumber("updatedUid", Long.class); + + public final ComparablePath uuid = createComparable("uuid", java.util.UUID.class); + + public final ListPath> validationRate = this.>createList("validationRate", Double.class, NumberPath.class, PathInits.DIRECT2); + + public QMapSheetAnalInferenceEntity(String variable) { + super(MapSheetAnalInferenceEntity.class, forVariable(variable)); + } + + public QMapSheetAnalInferenceEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QMapSheetAnalInferenceEntity(PathMetadata metadata) { + super(MapSheetAnalInferenceEntity.class, metadata); + } + +} + diff --git a/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetLearnDataGeomEntity.java b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetLearnDataGeomEntity.java new file mode 100644 index 0000000..3374760 --- /dev/null +++ b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetLearnDataGeomEntity.java @@ -0,0 +1,59 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QMapSheetLearnDataGeomEntity is a Querydsl query type for MapSheetLearnDataGeomEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMapSheetLearnDataGeomEntity extends EntityPathBase { + + private static final long serialVersionUID = 1704278203L; + + public static final QMapSheetLearnDataGeomEntity mapSheetLearnDataGeomEntity = new QMapSheetLearnDataGeomEntity("mapSheetLearnDataGeomEntity"); + + public final QCommonDateEntity _super = new QCommonDateEntity(this); + + public final NumberPath afterYyyy = createNumber("afterYyyy", Integer.class); + + public final NumberPath area = createNumber("area", Double.class); + + public final NumberPath beforeYyyy = createNumber("beforeYyyy", Integer.class); + + public final StringPath classAfterCd = createString("classAfterCd"); + + public final StringPath classBeforeCd = createString("classBeforeCd"); + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + public final BooleanPath fileCreateYn = createBoolean("fileCreateYn"); + + public final ComparablePath geom = createComparable("geom", org.locationtech.jts.geom.Geometry.class); + + public final NumberPath geoUid = createNumber("geoUid", Long.class); + + //inherited + public final DateTimePath modifiedDate = _super.modifiedDate; + + public QMapSheetLearnDataGeomEntity(String variable) { + super(MapSheetLearnDataGeomEntity.class, forVariable(variable)); + } + + public QMapSheetLearnDataGeomEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QMapSheetLearnDataGeomEntity(PathMetadata metadata) { + super(MapSheetLearnDataGeomEntity.class, metadata); + } + +} + diff --git a/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetLearnEntity.java b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetLearnEntity.java new file mode 100644 index 0000000..2f4b3ec --- /dev/null +++ b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QMapSheetLearnEntity.java @@ -0,0 +1,141 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QMapSheetLearnEntity is a Querydsl query type for MapSheetLearnEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QMapSheetLearnEntity extends EntityPathBase { + + private static final long serialVersionUID = 1571348757L; + + public static final QMapSheetLearnEntity mapSheetLearnEntity = new QMapSheetLearnEntity("mapSheetLearnEntity"); + + public final DateTimePath applyDttm = createDateTime("applyDttm", java.time.ZonedDateTime.class); + + public final StringPath applyStatus = createString("applyStatus"); + + public final DateTimePath applyStatusDttm = createDateTime("applyStatusDttm", java.time.ZonedDateTime.class); + + public final BooleanPath applyYn = createBoolean("applyYn"); + + public final StringPath chnDtctMstId = createString("chnDtctMstId"); + + public final NumberPath compareYyyy = createNumber("compareYyyy", Integer.class); + + public final DateTimePath createdDttm = createDateTime("createdDttm", java.time.ZonedDateTime.class); + + public final NumberPath createdUid = createNumber("createdUid", Long.class); + + public final NumberPath detectEndCnt = createNumber("detectEndCnt", Long.class); + + public final NumberPath detectingCnt = createNumber("detectingCnt", Long.class); + + public final StringPath detectOption = createString("detectOption"); + + public final DateTimePath elapsedTime = createDateTime("elapsedTime", java.time.ZonedDateTime.class); + + public final NumberPath id = createNumber("id", Long.class); + + public final DateTimePath inferEndDttm = createDateTime("inferEndDttm", java.time.ZonedDateTime.class); + + public final DateTimePath inferStartDttm = createDateTime("inferStartDttm", java.time.ZonedDateTime.class); + + public final NumberPath m1CompletedJobs = createNumber("m1CompletedJobs", Integer.class); + + public final NumberPath m1FailedJobs = createNumber("m1FailedJobs", Integer.class); + + public final NumberPath m1ModelBatchId = createNumber("m1ModelBatchId", Long.class); + + public final DateTimePath m1ModelEndDttm = createDateTime("m1ModelEndDttm", java.time.ZonedDateTime.class); + + public final DateTimePath m1ModelStartDttm = createDateTime("m1ModelStartDttm", java.time.ZonedDateTime.class); + + public final ComparablePath m1ModelUuid = createComparable("m1ModelUuid", java.util.UUID.class); + + public final NumberPath m1PendingJobs = createNumber("m1PendingJobs", Integer.class); + + public final NumberPath m1RunningJobs = createNumber("m1RunningJobs", Integer.class); + + public final NumberPath m2CompletedJobs = createNumber("m2CompletedJobs", Integer.class); + + public final NumberPath m2FailedJobs = createNumber("m2FailedJobs", Integer.class); + + public final NumberPath m2ModelBatchId = createNumber("m2ModelBatchId", Long.class); + + public final DateTimePath m2ModelEndDttm = createDateTime("m2ModelEndDttm", java.time.ZonedDateTime.class); + + public final DateTimePath m2ModelStartDttm = createDateTime("m2ModelStartDttm", java.time.ZonedDateTime.class); + + public final ComparablePath m2ModelUuid = createComparable("m2ModelUuid", java.util.UUID.class); + + public final NumberPath m2PendingJobs = createNumber("m2PendingJobs", Integer.class); + + public final NumberPath m2RunningJobs = createNumber("m2RunningJobs", Integer.class); + + public final NumberPath m3CompletedJobs = createNumber("m3CompletedJobs", Integer.class); + + public final NumberPath m3FailedJobs = createNumber("m3FailedJobs", Integer.class); + + public final NumberPath m3ModelBatchId = createNumber("m3ModelBatchId", Long.class); + + public final DateTimePath m3ModelEndDttm = createDateTime("m3ModelEndDttm", java.time.ZonedDateTime.class); + + public final DateTimePath m3ModelStartDttm = createDateTime("m3ModelStartDttm", java.time.ZonedDateTime.class); + + public final ComparablePath m3ModelUuid = createComparable("m3ModelUuid", java.util.UUID.class); + + public final NumberPath m3PendingJobs = createNumber("m3PendingJobs", Integer.class); + + public final NumberPath m3RunningJobs = createNumber("m3RunningJobs", Integer.class); + + public final StringPath mapSheetCnt = createString("mapSheetCnt"); + + public final StringPath mapSheetScope = createString("mapSheetScope"); + + public final StringPath modelComparePath = createString("modelComparePath"); + + public final StringPath modelTargetPath = createString("modelTargetPath"); + + public final StringPath runningModelType = createString("runningModelType"); + + public final NumberPath stage = createNumber("stage", Integer.class); + + public final StringPath status = createString("status"); + + public final NumberPath targetYyyy = createNumber("targetYyyy", Integer.class); + + public final StringPath title = createString("title"); + + public final NumberPath totalJobs = createNumber("totalJobs", Long.class); + + public final StringPath uid = createString("uid"); + + public final DateTimePath updatedDttm = createDateTime("updatedDttm", java.time.ZonedDateTime.class); + + public final NumberPath updatedUid = createNumber("updatedUid", Long.class); + + public final ComparablePath uuid = createComparable("uuid", java.util.UUID.class); + + public QMapSheetLearnEntity(String variable) { + super(MapSheetLearnEntity.class, forVariable(variable)); + } + + public QMapSheetLearnEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QMapSheetLearnEntity(PathMetadata metadata) { + super(MapSheetLearnEntity.class, metadata); + } + +} + diff --git a/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.java b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.java new file mode 100644 index 0000000..06510ac --- /dev/null +++ b/gukyuin/status-update/build/generated/sources/annotationProcessor/java/main/com/kamco/cd/kamcoback/postgres/entity/QPnuEntity.java @@ -0,0 +1,127 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QPnuEntity is a Querydsl query type for PnuEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QPnuEntity extends EntityPathBase { + + private static final long serialVersionUID = 2144018795L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QPnuEntity pnuEntity = new QPnuEntity("pnuEntity"); + + public final StringPath afClsCd = createString("afClsCd"); + + public final StringPath afClsProb = createString("afClsProb"); + + public final StringPath bfClsCd = createString("bfClsCd"); + + public final StringPath bfClsProb = createString("bfClsProb"); + + public final StringPath chgDt = createString("chgDt"); + + public final StringPath chgEpno = createString("chgEpno"); + + public final StringPath chgIp = createString("chgIp"); + + public final StringPath chgYn = createString("chgYn"); + + public final StringPath chnCd = createString("chnCd"); + + public final StringPath chnDtctContId = createString("chnDtctContId"); + + public final StringPath chnDtctId = createString("chnDtctId"); + + public final StringPath chnDtctMstId = createString("chnDtctMstId"); + + public final StringPath chnDtctObjtId = createString("chnDtctObjtId"); + + public final StringPath chnDtctProb = createString("chnDtctProb"); + + public final StringPath chnDtctSno = createString("chnDtctSno"); + + public final StringPath chnDtctSqms = createString("chnDtctSqms"); + + public final StringPath cprsYr = createString("cprsYr"); + + public final DateTimePath createdDttm = createDateTime("createdDttm", java.time.ZonedDateTime.class); + + public final NumberPath createdUid = createNumber("createdUid", Long.class); + + public final StringPath crtDt = createString("crtDt"); + + public final StringPath crtEpno = createString("crtEpno"); + + public final StringPath crtIp = createString("crtIp"); + + public final StringPath crtrYr = createString("crtrYr"); + + public final BooleanPath delYn = createBoolean("delYn"); + + public final QMapSheetAnalDataInferenceGeomEntity geo; + + public final NumberPath id = createNumber("id", Long.class); + + public final StringPath incyCd = createString("incyCd"); + + public final StringPath incyRsnCont = createString("incyRsnCont"); + + public final StringPath lblYn = createString("lblYn"); + + public final StringPath lockYn = createString("lockYn"); + + public final StringPath lrmSyncYmd = createString("lrmSyncYmd"); + + public final StringPath mpqdNo = createString("mpqdNo"); + + public final StringPath pnu = createString("pnu"); + + public final StringPath pnuDtctId = createString("pnuDtctId"); + + public final StringPath pnuDtctSqms = createString("pnuDtctSqms"); + + public final StringPath pnuSqms = createString("pnuSqms"); + + public final StringPath pnuSyncYmd = createString("pnuSyncYmd"); + + public final StringPath rmk = createString("rmk"); + + public final StringPath rsatctNo = createString("rsatctNo"); + + public final StringPath stbltYn = createString("stbltYn"); + + public QPnuEntity(String variable) { + this(PnuEntity.class, forVariable(variable), INITS); + } + + public QPnuEntity(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QPnuEntity(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QPnuEntity(PathMetadata metadata, PathInits inits) { + this(PnuEntity.class, metadata, inits); + } + + public QPnuEntity(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.geo = inits.isInitialized("geo") ? new QMapSheetAnalDataInferenceGeomEntity(forProperty("geo"), inits.get("geo")) : null; + } + +} + diff --git a/gukyuin/status-update/build/libs/status-update.jar b/gukyuin/status-update/build/libs/status-update.jar new file mode 100644 index 0000000..30622ad Binary files /dev/null and b/gukyuin/status-update/build/libs/status-update.jar differ diff --git a/gukyuin/status-update/build/reports/problems/problems-report.html b/gukyuin/status-update/build/reports/problems/problems-report.html new file mode 100644 index 0000000..3505134 --- /dev/null +++ b/gukyuin/status-update/build/reports/problems/problems-report.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Gradle Configuration Cache + + + +
+ +
+ Loading... +
+ + + + + + diff --git a/gukyuin/status-update/build/resolvedMainClassName b/gukyuin/status-update/build/resolvedMainClassName new file mode 100644 index 0000000..d27cb6f --- /dev/null +++ b/gukyuin/status-update/build/resolvedMainClassName @@ -0,0 +1 @@ +com.kamco.cd.kamcoback.KamcoBackApplication \ No newline at end of file diff --git a/gukyuin/status-update/build/resources/main/application-dev.yml b/gukyuin/status-update/build/resources/main/application-dev.yml new file mode 100644 index 0000000..2081606 --- /dev/null +++ b/gukyuin/status-update/build/resources/main/application-dev.yml @@ -0,0 +1,60 @@ +spring: + config: + activate: + on-profile: dev + + jpa: + show-sql: false + hibernate: + ddl-auto: validate + properties: + hibernate: + default_batch_fetch_size: 100 # ✅ 성능 - N+1 쿼리 방지 + order_updates: true # ✅ 성능 - 업데이트 순서 정렬로 데드락 방지 + order_inserts: true + use_sql_comments: true # ⚠️ 선택 - SQL에 주석 추가 (디버깅용) + format_sql: true # ⚠️ 선택 - SQL 포맷팅 (가독성) + jdbc: + batch_size: 1000 # ✅ 추가 (JDBC batch) + open-in-view: false + mvc: + async: + request-timeout: 300s # 5분 (예: 30s, 120s, 10m 등도 가능) + + datasource: + url: jdbc:postgresql://192.168.2.127:15432/kamco_cds + #url: jdbc:postgresql://localhost:15432/kamco_cds + username: kamco_cds + password: kamco_cds_Q!W@E#R$ + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-timeout: 60000 # 60초 연결 타임아웃 + idle-timeout: 300000 # 5분 유휴 타임아웃 + max-lifetime: 1800000 # 30분 최대 수명 + leak-detection-threshold: 60000 # 연결 누수 감지 + + transaction: + default-timeout: 300 # 5분 트랜잭션 타임아웃 + + data: + redis: + host: 192.168.2.109 + port: 6379 + password: kamco + +logging: + level: + root: INFO + org.springframework.web: DEBUG + org.springframework.security: DEBUG + + # 헬스체크 노이즈 핵심만 다운 + org.springframework.security.web.FilterChainProxy: INFO + org.springframework.security.web.authentication.AnonymousAuthenticationFilter: INFO + org.springframework.security.web.authentication.Http403ForbiddenEntryPoint: INFO + org.springframework.web.servlet.DispatcherServlet: INFO + +gukyuin: + url: http://192.168.2.129:5301 + cdi: ${gukyuin.url}/api/kcd/cdi diff --git a/gukyuin/status-update/build/resources/main/application-local.yml b/gukyuin/status-update/build/resources/main/application-local.yml new file mode 100644 index 0000000..cb09429 --- /dev/null +++ b/gukyuin/status-update/build/resources/main/application-local.yml @@ -0,0 +1,114 @@ +spring: + config: + activate: + on-profile: local + + jpa: + show-sql: false + hibernate: + ddl-auto: validate # 로컬만 완화(시킬려면 update으로 변경) + properties: + hibernate: + default_batch_fetch_size: 100 # ✅ 성능 - N+1 쿼리 방지 + order_updates: true # ✅ 성능 - 업데이트 순서 정렬로 데드락 방지 + use_sql_comments: true # ⚠️ 선택 - SQL에 주석 추가 (디버깅용) + format_sql: true # ⚠️ 선택 - SQL 포맷팅 (가독성) + + datasource: + url: jdbc:postgresql://192.168.2.127:15432/kamco_cds + # url: jdbc:postgresql://localhost:5432/local_0128 + username: kamco_cds + password: kamco_cds_Q!W@E#R$ + # username: postgres + # password: 1234 + hikari: + minimum-idle: 1 + maximum-pool-size: 5 + + data: + redis: + host: 192.168.2.109 + port: 6379 + password: kamco + + servlet: + multipart: + enabled: true + max-file-size: 4GB + max-request-size: 4GB + file-size-threshold: 10MB + +server: + tomcat: + max-swallow-size: 4GB + max-http-form-post-size: 4GB + +jwt: + secret: "kamco_token_9b71e778-19a3-4c1d-97bf-2d687de17d5b" + access-token-validity-in-ms: 86400000 # 1일 + refresh-token-validity-in-ms: 604800000 # 7일 + +token: + refresh-cookie-name: kamco-local # 개발용 쿠키 이름 + refresh-cookie-secure: false # 로컬 http 테스트면 false + +springdoc: + swagger-ui: + persist-authorization: true # 스웨거 새로고침해도 토큰 유지, 로컬스토리지에 저장 + +logging: + level: + org.hibernate.SQL: debug + org.hibernate.orm.jdbc.bind: trace + +mapsheet: + upload: + skipGdalValidation: true + shp: + baseurl: /Users/bokmin/detect/result + + + +file: + sync-root-dir: C:/Users/gypark/kamco-nfs/images/ + #sync-root-dir: /kamco-nfs/images/ + sync-tmp-dir: ${file.sync-root-dir}/tmp/ + sync-file-extention: tfw,tif + sync-auto-exception-start-year: 2025 + sync-auto-exception-before-year-cnt: 3 + + dataset-dir: C:/Users/gypark/kamco-nfs/dataset/ + #dataset-dir: /kamco-nfs/dataset/export/ + dataset-tmp-dir: ${file.dataset-dir}tmp/ + + model-dir: C:/Users/gypark/kamco-nfs/ckpt/model/ + #model-dir: /kamco-nfs/ckpt/model/ + model-tmp-dir: ${file.model-dir}tmp/ + model-file-extention: pth,json,py + + pt-path: /kamco-nfs/ckpt/classification/ + pt-FileName: v5-best.pt + + dataset-response: /kamco-nfs/dataset/response/ + +inference: + url: http://10.100.0.11:8000/jobs + batch-url: http://10.100.0.11:8000/batches + geojson-dir: /kamco-nfs/requests/ + jar-path: jar/makeshp-1.0.0.jar + inference-server-name: server1,server2,server3,server4 + +gukyuin: + #url: http://localhost:8080 + url: http://192.168.2.129:5301 + cdi: ${gukyuin.url}/api/kcd/cdi + +training-data: + geojson-dir: /kamco-nfs/model_output/labeling/ + +layer: + geoserver-url: https://kamco.geo-dev.gs.dabeeo.com + wms-path: geoserver/cd + wmts-path: geoserver/cd/gwc/service + workspace: cd + diff --git a/gukyuin/status-update/build/resources/main/application-prod.yml b/gukyuin/status-update/build/resources/main/application-prod.yml new file mode 100644 index 0000000..bcdba91 --- /dev/null +++ b/gukyuin/status-update/build/resources/main/application-prod.yml @@ -0,0 +1,48 @@ +spring: + config: + activate: + on-profile: prod + + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + default_batch_fetch_size: 100 # ✅ 성능 - N+1 쿼리 방지 + order_updates: true # ✅ 성능 - 업데이트 순서 정렬로 데드락 방지 + order_inserts: true + use_sql_comments: true # ⚠️ 선택 - SQL에 주석 추가 (디버깅용) + format_sql: true # ⚠️ 선택 - SQL 포맷팅 (가독성) + jdbc: + batch_size: 1000 # ✅ 추가 (JDBC batch) + open-in-view: false + mvc: + async: + request-timeout: 300s # 5분 (예: 30s, 120s, 10m 등도 가능) + + datasource: + url: jdbc:postgresql://kamco-cd-postgis:5432/kamco_cds + username: kamco_cds + password: kamco_cds_Q!W@E#R$ + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-timeout: 60000 # 60초 연결 타임아웃 + idle-timeout: 300000 # 5분 유휴 타임아웃 + max-lifetime: 1800000 # 30분 최대 수명 + leak-detection-threshold: 60000 # 연결 누수 감지 + + transaction: + default-timeout: 300 # 5분 트랜잭션 타임아웃 + +logging: + level: + root: INFO + org.springframework.web: DEBUG + org.springframework.security: DEBUG + +gukyuin: + url: http://172.16.4.56:15432 + cdi: ${gukyuin.url}/api/kcd/cdi + diff --git a/gukyuin/status-update/build/resources/main/application.yml b/gukyuin/status-update/build/resources/main/application.yml new file mode 100644 index 0000000..bebc73d --- /dev/null +++ b/gukyuin/status-update/build/resources/main/application.yml @@ -0,0 +1,8 @@ +server: + port: 8080 + +spring: + application: + name: kamco-gukyuin-label + profiles: + active: prod # 사용할 프로파일 지정 (ex. dev, prod, test) diff --git a/gukyuin/status-update/build/resources/main/static/chunk_upload_test.html b/gukyuin/status-update/build/resources/main/static/chunk_upload_test.html new file mode 100644 index 0000000..2c331d4 --- /dev/null +++ b/gukyuin/status-update/build/resources/main/static/chunk_upload_test.html @@ -0,0 +1,137 @@ + + + + + Chunk Upload Test + + +

대용량 파일 청크 업로드 테스트

+ +* Chunk 테스트 사이즈 10M (10 * 1024 * 1024) - 성능에 따라 변경가능

+ +* 업로드 API선택

+ +

+* 파일첨부

+

+ +



+* 업로드시 업로드 이력을 추적하기 위해 UUID생성해서 전달(파일병합시 사용)(script 예제참고)

+UUID :

+ +* API 호출시 파일정보 추출해서 자동 할당해야 함.(script 예제참고)

+chunkIndex :

+chunkTotalIndex :

+ +* API 호출시 파일정보 추출해서 자동 할당해야 함.(script 예제참고)

+fileSize :

+ + + +

+* 진행율(%)

+
+

+* 결과메세지

+
+ + + + diff --git a/gukyuin/status-update/build/tmp/bootJar/MANIFEST.MF b/gukyuin/status-update/build/tmp/bootJar/MANIFEST.MF new file mode 100644 index 0000000..cf24107 --- /dev/null +++ b/gukyuin/status-update/build/tmp/bootJar/MANIFEST.MF @@ -0,0 +1,12 @@ +Manifest-Version: 1.0 +Main-Class: org.springframework.boot.loader.launch.JarLauncher +Start-Class: com.kamco.cd.kamcoback.KamcoBackApplication +Spring-Boot-Version: 3.5.7 +Spring-Boot-Classes: BOOT-INF/classes/ +Spring-Boot-Lib: BOOT-INF/lib/ +Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx +Spring-Boot-Layers-Index: BOOT-INF/layers.idx +Build-Jdk-Spec: 21 +Implementation-Title: kamco-status-update-job +Implementation-Version: 0.0.1-SNAPSHOT + diff --git a/gukyuin/status-update/build/tmp/compileJava/previous-compilation-data.bin b/gukyuin/status-update/build/tmp/compileJava/previous-compilation-data.bin new file mode 100644 index 0000000..4387dc7 Binary files /dev/null and b/gukyuin/status-update/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/gukyuin/status-update/build/tmp/spotless-register-dependencies b/gukyuin/status-update/build/tmp/spotless-register-dependencies new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/gukyuin/status-update/build/tmp/spotless-register-dependencies @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/gukyuin/status-update/docker-compose-dev.yml b/gukyuin/status-update/docker-compose-dev.yml new file mode 100644 index 0000000..40b4346 --- /dev/null +++ b/gukyuin/status-update/docker-compose-dev.yml @@ -0,0 +1,35 @@ +services: + kamco-changedetection-api: + build: + context: . + dockerfile: Dockerfile-dev + args: + UID: 1000 # manager01 UID + GID: 1000 # manager01 GID + image: kamco-changedetection-api:${IMAGE_TAG:-latest} + container_name: kamco-changedetection-api + user: "1000:1000" + ports: + - "7100:8080" + environment: + - SPRING_PROFILES_ACTIVE=dev + - TZ=Asia/Seoul + volumes: + - /mnt/nfs_share/images:/app/original-images + - /mnt/nfs_share/model_output:/app/model-outputs + - /mnt/nfs_share/train_dataset:/app/train-dataset + - /mnt/nfs_share/tmp:/app/tmp + - /kamco-nfs:/kamco-nfs + networks: + - kamco-cds + restart: unless-stopped + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:8080/monitor/health" ] + interval: 10s + timeout: 5s + retries: 5 + start_period: 40s + +networks: + kamco-cds: + external: true diff --git a/gukyuin/status-update/gradle/wrapper/gradle-wrapper.jar b/gukyuin/status-update/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..1b33c55 Binary files /dev/null and b/gukyuin/status-update/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gukyuin/status-update/gradle/wrapper/gradle-wrapper.properties b/gukyuin/status-update/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ca025c8 --- /dev/null +++ b/gukyuin/status-update/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gukyuin/status-update/gradlew b/gukyuin/status-update/gradlew new file mode 100644 index 0000000..23d15a9 --- /dev/null +++ b/gukyuin/status-update/gradlew @@ -0,0 +1,251 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gukyuin/status-update/gradlew.bat b/gukyuin/status-update/gradlew.bat new file mode 100644 index 0000000..db3a6ac --- /dev/null +++ b/gukyuin/status-update/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/gukyuin/status-update/http/CommonCode.http b/gukyuin/status-update/http/CommonCode.http new file mode 100644 index 0000000..6083e22 --- /dev/null +++ b/gukyuin/status-update/http/CommonCode.http @@ -0,0 +1,4 @@ +### GET getByCodeId +GET http://localhost:8080/api/code/1 +Content-Type: application/json +### diff --git a/gukyuin/status-update/intellij-java-google-style.xml b/gukyuin/status-update/intellij-java-google-style.xml new file mode 100644 index 0000000..d63d731 --- /dev/null +++ b/gukyuin/status-update/intellij-java-google-style.xml @@ -0,0 +1,598 @@ + + + + + + diff --git a/gukyuin/status-update/settings.gradle b/gukyuin/status-update/settings.gradle new file mode 100644 index 0000000..52a2704 --- /dev/null +++ b/gukyuin/status-update/settings.gradle @@ -0,0 +1,6 @@ +pluginManagement { + plugins { + id 'org.jetbrains.kotlin.jvm' version '2.2.20' + } +} +rootProject.name = 'kamco-status-update-job' diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/KamcoBackApplication.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/KamcoBackApplication.java new file mode 100644 index 0000000..c6b1ae0 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/KamcoBackApplication.java @@ -0,0 +1,14 @@ +package com.kamco.cd.kamcoback; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@EnableScheduling +public class KamcoBackApplication { + + public static void main(String[] args) { + SpringApplication.run(KamcoBackApplication.class, args); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.java new file mode 100644 index 0000000..baa9fdc --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/code/dto/CommonCodeDto.java @@ -0,0 +1,189 @@ +package com.kamco.cd.kamcoback.code.dto; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.kamco.cd.kamcoback.common.utils.html.HtmlEscapeDeserializer; +import com.kamco.cd.kamcoback.common.utils.html.HtmlUnescapeSerializer; +import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import java.time.ZonedDateTime; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +public class CommonCodeDto { + + @Schema(name = "CodeAddReq", description = "공통코드 저장 정보") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class AddReq { + + @NotEmpty private String code; + @NotEmpty private String name; + private String description; + private int order; + private boolean used; + private Long parentId; + + @JsonDeserialize(using = HtmlEscapeDeserializer.class) + private String props1; + + @JsonDeserialize(using = HtmlEscapeDeserializer.class) + private String props2; + + @JsonDeserialize(using = HtmlEscapeDeserializer.class) + private String props3; + } + + @Schema(name = "CodeModifyReq", description = "공통코드 수정 정보") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ModifyReq { + + @NotEmpty private String name; + private String description; + private boolean used; + + @JsonDeserialize(using = HtmlEscapeDeserializer.class) + private String props1; + + @JsonDeserialize(using = HtmlEscapeDeserializer.class) + private String props2; + + @JsonDeserialize(using = HtmlEscapeDeserializer.class) + private String props3; + } + + @Schema(name = "CodeOrderReq", description = "공통코드 순서 변경 정보") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class OrderReq { + + @NotNull private Long id; + @NotNull private Integer order; + } + + @Schema(name = "CommonCode Basic", description = "공통코드 기본 정보") + @Getter + public static class Basic { + + private Long id; + private String code; + private String description; + private String name; + private Integer order; + private Boolean used; + private Boolean deleted; + private List children; + + @JsonFormatDttm private ZonedDateTime createdDttm; + + @JsonFormatDttm private ZonedDateTime updatedDttm; + + @JsonSerialize(using = HtmlUnescapeSerializer.class) + private String props1; + + @JsonSerialize(using = HtmlUnescapeSerializer.class) + private String props2; + + @JsonSerialize(using = HtmlUnescapeSerializer.class) + private String props3; + + @JsonFormatDttm private ZonedDateTime deletedDttm; + + public Basic( + Long id, + String code, + String description, + String name, + Integer order, + Boolean used, + Boolean deleted, + List children, + ZonedDateTime createdDttm, + ZonedDateTime updatedDttm, + String props1, + String props2, + String props3, + ZonedDateTime deletedDttm) { + this.id = id; + this.code = code; + this.description = description; + this.name = name; + this.order = order; + this.used = used; + this.deleted = deleted; + this.children = children; + this.createdDttm = createdDttm; + this.updatedDttm = updatedDttm; + this.props1 = props1; + this.props2 = props2; + this.props3 = props3; + this.deletedDttm = deletedDttm; + } + } + + @Schema(name = "SearchReq", description = "검색 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class SearchReq { + + // 검색 조건 + private String name; + + // 페이징 파라미터 + private int page = 0; + private int size = 20; + private String sort; + + public Pageable toPageable() { + if (sort != null && !sort.isEmpty()) { + String[] sortParams = sort.split(","); + String property = sortParams[0]; + Sort.Direction direction = + sortParams.length > 1 ? Sort.Direction.fromString(sortParams[1]) : Sort.Direction.ASC; + return PageRequest.of(page, size, Sort.by(direction, property)); + } + return PageRequest.of(page, size); + } + } + + @Getter + public static class Clazzes { + + private String code; + private String name; + private Integer order; + private String color; + + public Clazzes(String code, String name, Integer order, String color) { + this.code = code; + this.name = name; + this.order = order; + this.color = color; + } + } + + @Getter + @AllArgsConstructor + public static class CodeDto { + + private String code; + private String name; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/NetUtils.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/NetUtils.java new file mode 100644 index 0000000..9c6ee78 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/NetUtils.java @@ -0,0 +1,61 @@ +package com.kamco.cd.kamcoback.common.utils; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.net.InetAddress; +import java.net.URLEncoder; +import java.net.UnknownHostException; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.stream.Collectors; +import org.springframework.http.HttpHeaders; + +public class NetUtils { + + public String getLocalIP() { + + String ip; + { + try { + InetAddress local = InetAddress.getLocalHost(); + ip = local.getHostAddress(); + } catch (UnknownHostException e) { + throw new RuntimeException(e); + } + } + + return ip; + } + + public String dtoToQueryString(Object dto, String queryString) { + ObjectMapper objectMapper = new ObjectMapper(); + + Map map = objectMapper.convertValue(dto, Map.class); + + String qStr = + map.entrySet().stream() + .filter(entry -> entry.getValue() != null) // null 제외 + .map( + entry -> + String.format( + "%s=%s", + entry.getKey(), + URLEncoder.encode(entry.getValue().toString(), StandardCharsets.UTF_8))) + .collect(Collectors.joining("&")); + + if (queryString == null || queryString.isEmpty()) { + queryString = "?" + qStr; + } else { + queryString = queryString + "&" + qStr; + } + + // 2. Map을 쿼리 스트링 문자열로 변환 + return queryString; + } + + public HttpHeaders jsonHeaders() { + HttpHeaders headers = new HttpHeaders(); + headers.set(HttpHeaders.ACCEPT, "application/json;charset=UTF-8"); + headers.set(HttpHeaders.CONTENT_TYPE, "application/json;charset=UTF-8"); + return headers; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/CodeDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/CodeDto.java new file mode 100644 index 0000000..c77d1a2 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/CodeDto.java @@ -0,0 +1,20 @@ +package com.kamco.cd.kamcoback.common.utils.enums; + +public class CodeDto { + + private String code; + private String name; + + public CodeDto(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/CodeExpose.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/CodeExpose.java new file mode 100644 index 0000000..425e1f8 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/CodeExpose.java @@ -0,0 +1,10 @@ +package com.kamco.cd.kamcoback.common.utils.enums; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface CodeExpose {} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/CodeHidden.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/CodeHidden.java new file mode 100644 index 0000000..ad320cd --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/CodeHidden.java @@ -0,0 +1,10 @@ +package com.kamco.cd.kamcoback.common.utils.enums; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface CodeHidden {} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/EnumType.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/EnumType.java new file mode 100644 index 0000000..22761bb --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/EnumType.java @@ -0,0 +1,8 @@ +package com.kamco.cd.kamcoback.common.utils.enums; + +public interface EnumType { + + String getId(); + + String getText(); +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/EnumValidator.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/EnumValidator.java new file mode 100644 index 0000000..344fb02 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/EnumValidator.java @@ -0,0 +1,26 @@ +package com.kamco.cd.kamcoback.common.utils.enums; + +import com.kamco.cd.kamcoback.common.utils.interfaces.EnumValid; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + +public class EnumValidator implements ConstraintValidator { + + private Set acceptedValues; + + @Override + public void initialize(EnumValid constraintAnnotation) { + acceptedValues = + Arrays.stream(constraintAnnotation.enumClass().getEnumConstants()) + .map(Enum::name) + .collect(Collectors.toSet()); + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + return value != null && acceptedValues.contains(value); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/Enums.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/Enums.java new file mode 100644 index 0000000..97f2b3f --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/Enums.java @@ -0,0 +1,84 @@ +package com.kamco.cd.kamcoback.common.utils.enums; + +import com.kamco.cd.kamcoback.code.dto.CommonCodeDto.CodeDto; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.reflections.Reflections; + +public class Enums { + + private static final String BASE_PACKAGE = "com.kamco.cd.kamcoback"; + + /** 노출 가능한 enum만 모아둔 맵 key: enum simpleName (예: RoleType) value: enum Class */ + private static final Map>> exposedEnumMap = scanExposedEnumMap(); + + // code로 enum 찾기 + public static & EnumType> E fromId(Class enumClass, String id) { + if (id == null) { + return null; + } + + for (E e : enumClass.getEnumConstants()) { + if (id.equalsIgnoreCase(e.getId())) { + return e; + } + } + return null; + } + + // enum -> CodeDto list + public static List toList(Class> enumClass) { + Object[] enums = enumClass.getEnumConstants(); + + return Arrays.stream(enums) + .map(e -> (EnumType) e) + .filter(e -> !isHidden(enumClass, (Enum) e)) + .map(e -> new CodeDto(e.getId(), e.getText())) + .toList(); + } + + private static boolean isHidden(Class> enumClass, Enum e) { + try { + return enumClass.getField(e.name()).isAnnotationPresent(CodeHidden.class); + } catch (NoSuchFieldException ex) { + return false; + } + } + + /** 특정 타입(enum)만 조회 /codes/{type} -> type = RoleType 같은 값 */ + public static List getCodes(String type) { + Class> enumClass = exposedEnumMap.get(type); + if (enumClass == null) { + throw new IllegalArgumentException("지원하지 않는 코드 타입: " + type); + } + return toList(enumClass); + } + + /** 전체 enum 코드 조회 */ + public static Map> getAllCodes() { + Map> result = new HashMap<>(); + for (Map.Entry>> e : exposedEnumMap.entrySet()) { + result.put(e.getKey(), toList(e.getValue())); + } + return result; + } + + /** CodeExpose + EnumType 인 enum만 스캔해서 Map 구성 */ + private static Map>> scanExposedEnumMap() { + Reflections reflections = new Reflections(BASE_PACKAGE); + + Set> types = reflections.getTypesAnnotatedWith(CodeExpose.class); + + Map>> result = new HashMap<>(); + + for (Class clazz : types) { + if (clazz.isEnum() && EnumType.class.isAssignableFrom(clazz)) { + result.put(clazz.getSimpleName(), (Class>) clazz); + } + } + return result; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/ImageryFitStatus.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/ImageryFitStatus.java new file mode 100644 index 0000000..777c31f --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/enums/ImageryFitStatus.java @@ -0,0 +1,41 @@ +package com.kamco.cd.kamcoback.common.utils.enums; + +import java.util.Arrays; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@CodeExpose +@Getter +@AllArgsConstructor +public enum ImageryFitStatus implements EnumType { + FIT("적합"), + UNFIT("부적합"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + + public static ImageryFitStatus fromCode(String code) { + if (code == null) { + return null; + } + String c = code.trim(); + return Arrays.stream(values()) + .filter(v -> v.name().equalsIgnoreCase(c)) + .findFirst() + .orElse(null); + } + + public static String getDescByCode(String code) { + ImageryFitStatus status = fromCode(code); + return status != null ? status.getDesc() : null; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlEscapeDeserializer.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlEscapeDeserializer.java new file mode 100644 index 0000000..df1c8a3 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlEscapeDeserializer.java @@ -0,0 +1,18 @@ +package com.kamco.cd.kamcoback.common.utils.html; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import java.io.IOException; +import org.springframework.web.util.HtmlUtils; + +public class HtmlEscapeDeserializer extends JsonDeserializer { + + @Override + public Object deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException, JacksonException { + String value = jsonParser.getValueAsString(); + return value == null ? null : HtmlUtils.htmlEscape(value); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlUnescapeSerializer.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlUnescapeSerializer.java new file mode 100644 index 0000000..181a0ef --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/html/HtmlUnescapeSerializer.java @@ -0,0 +1,20 @@ +package com.kamco.cd.kamcoback.common.utils.html; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import java.io.IOException; +import org.springframework.web.util.HtmlUtils; + +public class HtmlUnescapeSerializer extends JsonSerializer { + @Override + public void serialize( + String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) + throws IOException { + if (value == null) { + jsonGenerator.writeNull(); + } else { + jsonGenerator.writeString(HtmlUtils.htmlUnescape(value)); + } + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/interfaces/EnumValid.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/interfaces/EnumValid.java new file mode 100644 index 0000000..5033df9 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/interfaces/EnumValid.java @@ -0,0 +1,23 @@ +package com.kamco.cd.kamcoback.common.utils.interfaces; + +import com.kamco.cd.kamcoback.common.utils.enums.EnumValidator; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +@Constraint(validatedBy = EnumValidator.class) +public @interface EnumValid { + + String message() default "올바르지 않은 값입니다."; + + Class[] groups() default {}; + + Class[] payload() default {}; + + Class> enumClass(); +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/interfaces/JsonFormatDttm.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/interfaces/JsonFormatDttm.java new file mode 100644 index 0000000..6145980 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/common/utils/interfaces/JsonFormatDttm.java @@ -0,0 +1,15 @@ +package com.kamco.cd.kamcoback.common.utils.interfaces; + +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.lang.annotation.*; + +@Target({ElementType.FIELD, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@JacksonAnnotationsInside +@JsonFormat( + shape = JsonFormat.Shape.STRING, + pattern = "yyyy-MM-dd'T'HH:mm:ssXXX", + timezone = "Asia/Seoul") +public @interface JsonFormatDttm {} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/config/QuerydslConfig.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/config/QuerydslConfig.java new file mode 100644 index 0000000..7db36f4 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/config/QuerydslConfig.java @@ -0,0 +1,18 @@ +package com.kamco.cd.kamcoback.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QuerydslConfig { + + @PersistenceContext private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/config/RestTemplateConfig.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/config/RestTemplateConfig.java new file mode 100644 index 0000000..c1e1a87 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/config/RestTemplateConfig.java @@ -0,0 +1,15 @@ +package com.kamco.cd.kamcoback.config; + +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate(RestTemplateBuilder builder) { + return builder.build(); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseDto.java new file mode 100644 index 0000000..c32c958 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseDto.java @@ -0,0 +1,223 @@ +package com.kamco.cd.kamcoback.config.api; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.ToString; +import org.springframework.http.HttpStatus; + +@Getter +@ToString +public class ApiResponseDto { + + private T data; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private Error error; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private T errorData; + + @JsonIgnore private HttpStatus httpStatus; + + @JsonIgnore private Long errorLogUid; + + public ApiResponseDto(T data) { + this.data = data; + } + + private ApiResponseDto(T data, HttpStatus httpStatus) { + this.data = data; + this.httpStatus = httpStatus; + } + + public ApiResponseDto(ApiResponseCode code) { + this.error = new Error(code.getId(), code.getMessage()); + } + + public ApiResponseDto(ApiResponseCode code, String message) { + this.error = new Error(code.getId(), message); + } + + public ApiResponseDto(ApiResponseCode code, String message, HttpStatus httpStatus) { + this.error = new Error(code.getId(), message); + this.httpStatus = httpStatus; + } + + public ApiResponseDto( + ApiResponseCode code, String message, HttpStatus httpStatus, Long errorLogUid) { + this.error = new Error(code.getId(), message); + this.httpStatus = httpStatus; + this.errorLogUid = errorLogUid; + } + + public ApiResponseDto(ApiResponseCode code, String message, T errorData) { + this.error = new Error(code.getId(), message); + this.errorData = errorData; + } + + // HTTP 상태 코드가 내장된 ApiResponseDto 반환 메서드들 + public static ApiResponseDto createOK(T data) { + return new ApiResponseDto<>(data, HttpStatus.CREATED); + } + + public static ApiResponseDto ok(T data) { + return new ApiResponseDto<>(data, HttpStatus.OK); + } + + public static ApiResponseDto okObject(ResponseObj data) { + if (data.getCode().equals(ApiResponseCode.OK)) { + return new ApiResponseDto<>(data, HttpStatus.NO_CONTENT); + } else { + return new ApiResponseDto<>(data.getCode(), data.getMessage(), HttpStatus.CONFLICT); + } + } + + public static ApiResponseDto deleteOk(T data) { + return new ApiResponseDto<>(data, HttpStatus.NO_CONTENT); + } + + public static ApiResponseDto createException(ApiResponseCode code) { + return new ApiResponseDto<>(code); + } + + public static ApiResponseDto createException(ApiResponseCode code, String message) { + return new ApiResponseDto<>(code, message); + } + + public static ApiResponseDto createException( + ApiResponseCode code, String message, HttpStatus httpStatus) { + return new ApiResponseDto<>(code, message, httpStatus); + } + + public static ApiResponseDto createException( + ApiResponseCode code, String message, HttpStatus httpStatus, Long errorLogUid) { + return new ApiResponseDto<>(code, message, httpStatus, errorLogUid); + } + + public static ApiResponseDto createException( + ApiResponseCode code, String message, T data) { + return new ApiResponseDto<>(code, message, data); + } + + @Getter + public static class Error { + + private final String code; + private final String message; + + public Error(String code, String message) { + this.code = code; + this.message = message; + } + } + + /** Error가 아닌 Business상 성공이거나 실패인 경우, 메세지 함께 전달하기 위한 object */ + @Getter + public static class ResponseObj { + + private final ApiResponseCode code; + private final String message; + + public ResponseObj(ApiResponseCode code, String message) { + this.code = code; + this.message = message; + } + } + + @Getter + @RequiredArgsConstructor + public enum ApiResponseCode implements EnumType { + + // @formatter:off + OK("요청이 성공하였습니다."), + BAD_REQUEST("요청 파라미터가 잘못되었습니다."), + BAD_GATEWAY("네트워크 상태가 불안정합니다."), + ALREADY_EXIST_MALL("이미 등록된 쇼핑센터입니다."), + NOT_FOUND_MAP("지도를 찾을 수 없습니다."), + UNAUTHORIZED("권한이 없습니다."), + CONFLICT("이미 등록된 컨텐츠입니다."), + NOT_FOUND("Resource를 찾을 수 없습니다."), + NOT_FOUND_DATA("데이터를 찾을 수 없습니다."), + NOT_FOUND_WEATHER_DATA("날씨 데이터를 찾을 수 없습니다."), + FAIL_SEND_MESSAGE("메시지를 전송하지 못했습니다."), + TOO_MANY_CONNECTED_MACHINES("연결된 기기가 너무 많습니다."), + UNAUTHENTICATED("인증에 실패하였습니다."), + INVALID_TOKEN("잘못된 토큰입니다."), + EXPIRED_TOKEN("만료된 토큰입니다."), + INTERNAL_SERVER_ERROR("서버에 문제가 발생 하였습니다."), + FORBIDDEN("권한을 확인해주세요."), + INVALID_PASSWORD("잘못된 비밀번호 입니다."), + NOT_FOUND_CAR_IN("입차정보가 없습니다."), + WRONG_STATUS("잘못된 상태입니다."), + FAIL_VERIFICATION("인증에 실패하였습니다."), + INVALID_EMAIL("잘못된 형식의 이메일입니다."), + REQUIRED_EMAIL("이메일은 필수 항목입니다."), + WRONG_PASSWORD("잘못된 패스워드입니다."), + DUPLICATE_EMAIL("이미 가입된 이메일입니다."), + DUPLICATE_DATA("이미 등록되어 있습니다."), + DATA_INTEGRITY_ERROR("데이터 무결성이 위반되어 요청을 처리할수 없습니다."), + FOREIGN_KEY_ERROR("참조 중인 데이터가 있어 삭제할 수 없습니다."), + DUPLICATE_EMPLOYEEID("이미 가입된 사번입니다."), + NOT_FOUND_USER_FOR_EMAIL("이메일로 유저를 찾을 수 없습니다."), + NOT_FOUND_USER("사용자를 찾을 수 없습니다."), + UNPROCESSABLE_ENTITY("이 데이터는 삭제할 수 없습니다."), + LOGIN_ID_NOT_FOUND("아이디를 잘못 입력하셨습니다."), + LOGIN_PASSWORD_MISMATCH("비밀번호를 잘못 입력하셨습니다."), + LOGIN_PASSWORD_EXCEEDED("비밀번호 오류 횟수를 초과하여 이용하실 수 없습니다.\n로그인 오류에 대해 관리자에게 문의하시기 바랍니다."), + INACTIVE_ID("사용할 수 없는 계정입니다."), + INVALID_EMAIL_TOKEN( + "You can only reset your password within 24 hours from when the email was sent.\n" + + "To reset your password again, please submit a new request through \"Forgot" + + " Password.\""), + PAYLOAD_TOO_LARGE("업로드 용량 제한을 초과했습니다."), + NOT_FOUND_TARGET_YEAR("기준년도 도엽을 찾을 수 없습니다."), + NOT_FOUND_COMPARE_YEAR("비교년도 도엽을 찾을 수 없습니다."), + FAIL_SAVE_MAP_SHEET("도엽 저장 중 오류가 발생했습니다."), + FAIL_CREATE_MAP_SHEET_FILE("도엽 설정파일 생성 중 오류가 발생했습니다."), + ; + // @formatter:on + private final String message; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return message; + } + + public static ApiResponseCode getCode(String name) { + return ApiResponseCode.valueOf(name.toUpperCase()); + } + + public static String getMessage(String name) { + return ApiResponseCode.valueOf(name.toUpperCase()).getText(); + } + + public static ApiResponseCode from(String codeName, HttpStatus status) { + + if (codeName != null && !codeName.isBlank()) { + try { + return ApiResponseCode.valueOf(codeName.toUpperCase()); + } catch (IllegalArgumentException ignore) { + // fallback + } + } + + if (status != null) { + try { + return ApiResponseCode.valueOf(status.name()); + } catch (IllegalArgumentException ignore) { + // fallback + } + } + + return INTERNAL_SERVER_ERROR; + } + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/config/resttemplate/ExternalHttpClient.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/config/resttemplate/ExternalHttpClient.java new file mode 100644 index 0000000..e4e656d --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/config/resttemplate/ExternalHttpClient.java @@ -0,0 +1,120 @@ +package com.kamco.cd.kamcoback.config.resttemplate; + +import com.fasterxml.jackson.databind.ObjectMapper; +import java.nio.charset.StandardCharsets; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestTemplate; + +@RequiredArgsConstructor +@Component +@Log4j2 +public class ExternalHttpClient { + + private final RestTemplate restTemplate; + private final ObjectMapper objectMapper; + + public ExternalCallResult call( + String url, HttpMethod method, Object body, HttpHeaders headers, Class responseType) { + + // responseType 기반으로 Accept 동적 세팅 + HttpHeaders resolvedHeaders = resolveHeaders(headers, responseType); + logRequestBody(body); + + HttpEntity entity = new HttpEntity<>(body, resolvedHeaders); + + try { + // String: raw bytes -> UTF-8 string + if (responseType == String.class) { + ResponseEntity res = restTemplate.exchange(url, method, entity, byte[].class); + String raw = + (res.getBody() == null) ? null : new String(res.getBody(), StandardCharsets.UTF_8); + + @SuppressWarnings("unchecked") + T casted = (T) raw; + return new ExternalCallResult<>(res.getStatusCodeValue(), true, casted, null); + } + + // byte[]: raw bytes로 받고, JSON이면 에러로 처리 + if (responseType == byte[].class) { + ResponseEntity res = restTemplate.exchange(url, method, entity, byte[].class); + + MediaType ct = res.getHeaders().getContentType(); + byte[] bytes = res.getBody(); + + if (isJsonLike(ct)) { + String err = (bytes == null) ? null : new String(bytes, StandardCharsets.UTF_8); + return new ExternalCallResult<>(res.getStatusCodeValue(), false, null, err); + } + + @SuppressWarnings("unchecked") + T casted = (T) bytes; + return new ExternalCallResult<>(res.getStatusCodeValue(), true, casted, null); + } + + // DTO 등: 일반 역직렬화 + ResponseEntity res = restTemplate.exchange(url, method, entity, responseType); + return new ExternalCallResult<>(res.getStatusCodeValue(), true, res.getBody(), null); + + } catch (HttpStatusCodeException e) { + return new ExternalCallResult<>( + e.getStatusCode().value(), false, null, e.getResponseBodyAsString()); + } + } + + // 기존 resolveJsonHeaders를 "동적"으로 교체 + private HttpHeaders resolveHeaders(HttpHeaders headers, Class responseType) { + // 원본 headers를 그대로 쓰면 외부에서 재사용할 때 사이드이펙트 날 수 있어서 복사 권장 + HttpHeaders h = (headers == null) ? new HttpHeaders() : new HttpHeaders(headers); + + // 요청 바디 기본은 JSON이라고 가정 (필요하면 호출부에서 덮어쓰기) + if (h.getContentType() == null) { + h.setContentType(MediaType.APPLICATION_JSON); + } + + // 호출부에서 Accept를 명시했으면 존중 + if (h.getAccept() != null && !h.getAccept().isEmpty()) { + return h; + } + + // responseType 기반 Accept 자동 지정 + if (responseType == byte[].class) { + h.setAccept( + List.of( + MediaType.APPLICATION_OCTET_STREAM, + MediaType.valueOf("application/zip"), + MediaType.APPLICATION_JSON // 실패(JSON 에러 바디) 대비 + )); + } else { + h.setAccept(List.of(MediaType.APPLICATION_JSON)); + } + + return h; + } + + private boolean isJsonLike(MediaType ct) { + if (ct == null) return false; + return ct.includes(MediaType.APPLICATION_JSON) + || "application/problem+json".equalsIgnoreCase(ct.toString()); + } + + private void logRequestBody(Object body) { + try { + if (body != null) { + log.info("[HTTP-REQ-BODY-JSON] {}", objectMapper.writeValueAsString(body)); + } + } catch (Exception e) { + log.warn("[HTTP-REQ-BODY-JSON] serialize failed: {}", e.getMessage()); + } + } + + public record ExternalCallResult(int statusCode, boolean success, T body, String errBody) {} +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/ApiResponseDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/ApiResponseDto.java new file mode 100644 index 0000000..56313e3 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/ApiResponseDto.java @@ -0,0 +1,223 @@ +package com.kamco.cd.kamcoback.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.kamco.cd.kamcoback.inferface.EnumType; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.ToString; +import org.springframework.http.HttpStatus; + +@Getter +@ToString +public class ApiResponseDto { + + private T data; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private Error error; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private T errorData; + + @JsonIgnore private HttpStatus httpStatus; + + @JsonIgnore private Long errorLogUid; + + public ApiResponseDto(T data) { + this.data = data; + } + + private ApiResponseDto(T data, HttpStatus httpStatus) { + this.data = data; + this.httpStatus = httpStatus; + } + + public ApiResponseDto(ApiResponseCode code) { + this.error = new Error(code.getId(), code.getMessage()); + } + + public ApiResponseDto(ApiResponseCode code, String message) { + this.error = new Error(code.getId(), message); + } + + public ApiResponseDto(ApiResponseCode code, String message, HttpStatus httpStatus) { + this.error = new Error(code.getId(), message); + this.httpStatus = httpStatus; + } + + public ApiResponseDto( + ApiResponseCode code, String message, HttpStatus httpStatus, Long errorLogUid) { + this.error = new Error(code.getId(), message); + this.httpStatus = httpStatus; + this.errorLogUid = errorLogUid; + } + + public ApiResponseDto(ApiResponseCode code, String message, T errorData) { + this.error = new Error(code.getId(), message); + this.errorData = errorData; + } + + // HTTP 상태 코드가 내장된 ApiResponseDto 반환 메서드들 + public static ApiResponseDto createOK(T data) { + return new ApiResponseDto<>(data, HttpStatus.CREATED); + } + + public static ApiResponseDto ok(T data) { + return new ApiResponseDto<>(data, HttpStatus.OK); + } + + public static ApiResponseDto okObject(ResponseObj data) { + if (data.getCode().equals(ApiResponseCode.OK)) { + return new ApiResponseDto<>(data, HttpStatus.NO_CONTENT); + } else { + return new ApiResponseDto<>(data.getCode(), data.getMessage(), HttpStatus.CONFLICT); + } + } + + public static ApiResponseDto deleteOk(T data) { + return new ApiResponseDto<>(data, HttpStatus.NO_CONTENT); + } + + public static ApiResponseDto createException(ApiResponseCode code) { + return new ApiResponseDto<>(code); + } + + public static ApiResponseDto createException(ApiResponseCode code, String message) { + return new ApiResponseDto<>(code, message); + } + + public static ApiResponseDto createException( + ApiResponseCode code, String message, HttpStatus httpStatus) { + return new ApiResponseDto<>(code, message, httpStatus); + } + + public static ApiResponseDto createException( + ApiResponseCode code, String message, HttpStatus httpStatus, Long errorLogUid) { + return new ApiResponseDto<>(code, message, httpStatus, errorLogUid); + } + + public static ApiResponseDto createException( + ApiResponseCode code, String message, T data) { + return new ApiResponseDto<>(code, message, data); + } + + @Getter + public static class Error { + + private final String code; + private final String message; + + public Error(String code, String message) { + this.code = code; + this.message = message; + } + } + + /** Error가 아닌 Business상 성공이거나 실패인 경우, 메세지 함께 전달하기 위한 object */ + @Getter + public static class ResponseObj { + + private final ApiResponseCode code; + private final String message; + + public ResponseObj(ApiResponseCode code, String message) { + this.code = code; + this.message = message; + } + } + + @Getter + @RequiredArgsConstructor + public enum ApiResponseCode implements EnumType { + + // @formatter:off + OK("요청이 성공하였습니다."), + BAD_REQUEST("요청 파라미터가 잘못되었습니다."), + BAD_GATEWAY("네트워크 상태가 불안정합니다."), + ALREADY_EXIST_MALL("이미 등록된 쇼핑센터입니다."), + NOT_FOUND_MAP("지도를 찾을 수 없습니다."), + UNAUTHORIZED("권한이 없습니다."), + CONFLICT("이미 등록된 컨텐츠입니다."), + NOT_FOUND("Resource를 찾을 수 없습니다."), + NOT_FOUND_DATA("데이터를 찾을 수 없습니다."), + NOT_FOUND_WEATHER_DATA("날씨 데이터를 찾을 수 없습니다."), + FAIL_SEND_MESSAGE("메시지를 전송하지 못했습니다."), + TOO_MANY_CONNECTED_MACHINES("연결된 기기가 너무 많습니다."), + UNAUTHENTICATED("인증에 실패하였습니다."), + INVALID_TOKEN("잘못된 토큰입니다."), + EXPIRED_TOKEN("만료된 토큰입니다."), + INTERNAL_SERVER_ERROR("서버에 문제가 발생 하였습니다."), + FORBIDDEN("권한을 확인해주세요."), + INVALID_PASSWORD("잘못된 비밀번호 입니다."), + NOT_FOUND_CAR_IN("입차정보가 없습니다."), + WRONG_STATUS("잘못된 상태입니다."), + FAIL_VERIFICATION("인증에 실패하였습니다."), + INVALID_EMAIL("잘못된 형식의 이메일입니다."), + REQUIRED_EMAIL("이메일은 필수 항목입니다."), + WRONG_PASSWORD("잘못된 패스워드입니다."), + DUPLICATE_EMAIL("이미 가입된 이메일입니다."), + DUPLICATE_DATA("이미 등록되어 있습니다."), + DATA_INTEGRITY_ERROR("데이터 무결성이 위반되어 요청을 처리할수 없습니다."), + FOREIGN_KEY_ERROR("참조 중인 데이터가 있어 삭제할 수 없습니다."), + DUPLICATE_EMPLOYEEID("이미 가입된 사번입니다."), + NOT_FOUND_USER_FOR_EMAIL("이메일로 유저를 찾을 수 없습니다."), + NOT_FOUND_USER("사용자를 찾을 수 없습니다."), + UNPROCESSABLE_ENTITY("이 데이터는 삭제할 수 없습니다."), + LOGIN_ID_NOT_FOUND("아이디를 잘못 입력하셨습니다."), + LOGIN_PASSWORD_MISMATCH("비밀번호를 잘못 입력하셨습니다."), + LOGIN_PASSWORD_EXCEEDED("비밀번호 오류 횟수를 초과하여 이용하실 수 없습니다.\n로그인 오류에 대해 관리자에게 문의하시기 바랍니다."), + INACTIVE_ID("사용할 수 없는 계정입니다."), + INVALID_EMAIL_TOKEN( + "You can only reset your password within 24 hours from when the email was sent.\n" + + "To reset your password again, please submit a new request through \"Forgot" + + " Password.\""), + PAYLOAD_TOO_LARGE("업로드 용량 제한을 초과했습니다."), + NOT_FOUND_TARGET_YEAR("기준년도 도엽을 찾을 수 없습니다."), + NOT_FOUND_COMPARE_YEAR("비교년도 도엽을 찾을 수 없습니다."), + FAIL_SAVE_MAP_SHEET("도엽 저장 중 오류가 발생했습니다."), + FAIL_CREATE_MAP_SHEET_FILE("도엽 설정파일 생성 중 오류가 발생했습니다."), + ; + // @formatter:on + private final String message; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return message; + } + + public static ApiResponseCode getCode(String name) { + return ApiResponseCode.valueOf(name.toUpperCase()); + } + + public static String getMessage(String name) { + return ApiResponseCode.valueOf(name.toUpperCase()).getText(); + } + + public static ApiResponseCode from(String codeName, HttpStatus status) { + + if (codeName != null && !codeName.isBlank()) { + try { + return ApiResponseCode.valueOf(codeName.toUpperCase()); + } catch (IllegalArgumentException ignore) { + // fallback + } + } + + if (status != null) { + try { + return ApiResponseCode.valueOf(status.name()); + } catch (IllegalArgumentException ignore) { + // fallback + } + } + + return INTERNAL_SERVER_ERROR; + } + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/LabelAllocateDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/LabelAllocateDto.java new file mode 100644 index 0000000..f07f34c --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/LabelAllocateDto.java @@ -0,0 +1,362 @@ +package com.kamco.cd.kamcoback.label.dto; + +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import io.swagger.v3.oas.annotations.media.Schema; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +public class LabelAllocateDto { + + @CodeExpose + @Getter + @AllArgsConstructor + public enum LabelMngState implements EnumType { + PENDING("작업대기"), + ASSIGNED("작업할당"), + ING("진행중"), + FINISH("종료"); + + private String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + } + + @CodeExpose + @Getter + @AllArgsConstructor + public enum LabelState implements EnumType { + WAIT("대기"), + ASSIGNED("배정"), + SKIP("스킵"), + DONE("완료"); + + private String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + } + + @CodeExpose + @Getter + @AllArgsConstructor + public enum InspectState implements EnumType { + UNCONFIRM("미확인"), + EXCEPT("제외"), + COMPLETE("완료"); + + private String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + } + + @Getter + @Setter + @AllArgsConstructor + public static class AllocateDto { + + @Schema( + description = "회차 마스터 key", + example = "f97dc186-e6d3-4645-9737-3173dde8dc64", + required = true) + private UUID uuid; + + @Schema(description = "비교년도-기준년도", example = "2022-2024", required = true) + private String yyyy; + + // @Schema(description = "비교년도", example = "2022", required = true) + // private Integer compareYyyy; + // + // @Schema(description = "기준년도", example = "2024", required = true) + // private Integer targetYyyy; + + @Schema(description = "회차", example = "4") + private Integer stage; + + @Schema( + description = "라벨러 할당 목록", + example = + """ + [ + { + "userId": "123456", + "demand": 1000 + }, + { + "userId": "010222297501", + "demand": 400 + }, + { + "userId": "01022223333", + "demand": 440 + } + ] + """) + private List labelers; + + @Schema( + description = "검수자 할당 목록", + example = + """ + ["K20251216001", + "01022225555", + "K20251212001" + ] + """) + private List inspectors; + } + + @Getter + public static class TargetUser { + + @Schema(description = "라벨러 사번", example = "labeler44") + private final String userId; + + @Schema(description = "할당 건수", example = "200") + private final int demand; + + public TargetUser(String userId, int demand) { + this.userId = userId; + this.demand = demand; + } + } + + @Getter + @AllArgsConstructor + public static class TargetInspector { + + @Schema(description = "검수자 사번", example = "K20251212001") + private final String inspectorUid; + + @Schema(description = "할당 명수", example = "3") + private int userCount; + } + + @Getter + @Setter + @AllArgsConstructor + public static class Basic { + + private UUID assignmentUid; + private Long inferenceGeomUid; + private String workerUid; + private String inspectorUid; + private String workState; + private Character stagnationYn; + private String assignGroupId; + private Long learnGeomUid; + private Long analUid; + private ZonedDateTime createdDttm; + private ZonedDateTime updatedDttm; + private String inspectState; + private ZonedDateTime workStatDttm; + private ZonedDateTime inspectStatDttm; + } + + @Getter + @Setter + @AllArgsConstructor + public static class UserList { + + private String userRole; + private String employeeNo; + private String name; + } + + @Getter + @Setter + @AllArgsConstructor + public static class InferenceDetail { + + private String analTitle; + private Integer stage; + private ZonedDateTime gukyuinDttm; + private Long count; + } + + @Getter + @Setter + @AllArgsConstructor + public static class LabelerDetail { + + private String roleType; + private String name; + private String userId; // 사번 + private Long count; + private Long completeCnt; + private Long skipCnt; + private Double percent; + private Integer ranking; + private ZonedDateTime createdDttm; + private String ownerName; + private Long remainCnt; + } + + @Getter + @Setter + @AllArgsConstructor + public static class AllocateMoveDto { + + @Schema(description = "총 잔여 건수", example = "5061") + private Integer totalCnt; + + @Schema( + description = "이관할 라벨러", + example = """ + [ + "87654321" + ] + """) + private List labelers; + + @Schema(description = "회차 마스터 key", example = "f97dc186-e6d3-4645-9737-3173dde8dc64") + private String uuid; + + @Schema(description = "대상 사번", example = "01022223333") + private String userId; + } + + @Getter + @Setter + @AllArgsConstructor + public static class AllocateInfoDto { + + private Long geoUid; + private Long mapSheetNum; + private Long pnu; + } + + @Getter + @Setter + @AllArgsConstructor + public static class LabelingStatDto { + + private String workDate; + private Long dailyTotalCnt; + private Long totalCnt; + private Long assignedCnt; + private Long skipCnt; + private Long completeCnt; + private Long remainCnt; + } + + @Schema(name = "searchReq", description = "일자별 작업 목록 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class searchReq { + + // 페이징 파라미터 + private int page = 0; + private int size = 20; + private String sort; + + public Pageable toPageable() { + if (sort != null && !sort.isEmpty()) { + String[] sortParams = sort.split(","); + String property = sortParams[0]; + Sort.Direction direction = + sortParams.length > 1 ? Sort.Direction.fromString(sortParams[1]) : Sort.Direction.ASC; + return PageRequest.of(page, size, Sort.by(direction, property)); + } + return PageRequest.of(page, size); + } + } + + @Getter + @Setter + @AllArgsConstructor + public static class MoveUserList { + + private String userRole; + private String employeeNo; + private String name; + private Long remainCnt; + private Double percent; + } + + @Getter + @Setter + @AllArgsConstructor + public static class MoveInfo { + + private Long totalCnt; + private List moveUserList; + } + + @Schema(name = "WorkHistoryDto", description = "WorkHistoryDto") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class WorkHistoryDto { + + @Schema(description = "행 번호") + private Integer rowNum; + + @Schema(description = "변화탐지년도", example = "2021-2022") + private String changeDetectionYear; + + @Schema(description = "국유IN 회차") + private Long stage; + + @Schema(description = "반영일") + private ZonedDateTime gukyuinApplyDttm; + + @Schema(description = "할당건수") + private Long assignedCnt; + + @Schema(description = "완료건수") + private Long completeCnt; + + @Schema(description = "Skip건수") + private Long skipCnt; + + @Schema(description = "잔여건수") + private Long remainCnt; + + @Schema(description = "상태 (진행중/완료)") + private String status; + + @Schema(description = "진행률 (%)") + private Double percent; + + @Schema(description = "작업기간 시작일") + private ZonedDateTime createdDttm; + + @Schema(description = "작업기간 종료일") + private ZonedDateTime projectCloseDttm; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/LabelInspectorDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/LabelInspectorDto.java new file mode 100644 index 0000000..89fd8ef --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/LabelInspectorDto.java @@ -0,0 +1,22 @@ +package com.kamco.cd.kamcoback.label.dto; + +import java.time.ZonedDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +public class LabelInspectorDto { + + @Getter + @Setter + @AllArgsConstructor + public static class Basic { + + private UUID operatorUid; + private Long analUid; + private String inspectorUid; + private ZonedDateTime createdDttm; + private ZonedDateTime updatedDttm; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/LabelLabelerDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/LabelLabelerDto.java new file mode 100644 index 0000000..80360db --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/LabelLabelerDto.java @@ -0,0 +1,27 @@ +package com.kamco.cd.kamcoback.label.dto; + +import java.time.ZonedDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +public class LabelLabelerDto { + + @Getter + @Setter + @AllArgsConstructor + public static class Basic { + + private UUID lbUsrUid; + private Long analUid; + private String workerUid; + private Long allocateCnt; + private Boolean deleted; + private Boolean reAllocateYn; + private Long reAllocateCnt; + private String reAllocateWorkerUid; + private ZonedDateTime createdDttm; + private ZonedDateTime updatedDttm; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto.java new file mode 100644 index 0000000..7d452c8 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/dto/TrainingDataReviewJobDto.java @@ -0,0 +1,137 @@ +package com.kamco.cd.kamcoback.scheduler.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.kamco.cd.kamcoback.scheduler.dto.TrainingDataReviewJobDto.CompleteLabelData.GeoJsonFeature; +import java.util.List; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +public class TrainingDataReviewJobDto { + + @Getter + @Setter + @RequiredArgsConstructor + @AllArgsConstructor + public static class Tasks { + + private UUID assignmentUid; + private Long inferenceUid; + private Long analUid; + } + + @Getter + @Setter + @RequiredArgsConstructor + @AllArgsConstructor + public static class InspectorPendingDto { + + String inspectorUid; + Long pendingCount; + } + + @Getter + @Setter + @RequiredArgsConstructor + @AllArgsConstructor + public static class AnalCntInfo { + + Long analUid; + String resultUid; + Long allCnt; + Long completeCnt; + Long fileCnt; + } + + @Getter + @Setter + @RequiredArgsConstructor + @AllArgsConstructor + public static class AnalMapSheetList { + + private Integer compareYyyy; + private Integer targetYyyy; + private String mapSheetNum; + } + + @Getter + @Setter + @JsonPropertyOrder({"type", "features"}) + public static class FeatureCollection { + + private final String type = "FeatureCollection"; + private List features; + + public FeatureCollection(List features) { + this.features = features; + } + } + + @Getter + @Setter + @JsonPropertyOrder({"type", "geometry", "properties"}) + public static class CompleteLabelData { + + private Long geoUid; + private String type; + @JsonIgnore private String geomStr; + private JsonNode geometry; + private Properties properties; + + public CompleteLabelData(Long geoUid, String type, String geomStr, Properties properties) { + this.geoUid = geoUid; + this.type = type; + this.geomStr = geomStr; + ObjectMapper mapper = new ObjectMapper(); + JsonNode jsonNode = null; + try { + if (geomStr != null) { + jsonNode = mapper.readTree(this.geomStr); + } + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + this.geometry = jsonNode; + if (jsonNode != null && jsonNode.isObject()) { + ((ObjectNode) jsonNode).remove("crs"); + } + + this.properties = properties; + } + + @Getter + @Setter + @RequiredArgsConstructor + @AllArgsConstructor + public static class Properties { + + private String modelId; + private String before; + private String after; + } + + @Getter + @AllArgsConstructor + public static class GeoJsonFeature { + + private String type; + private JsonNode geometry; + private Properties properties; + + public static GeoJsonFeature from(CompleteLabelData data) { + return new GeoJsonFeature( + data.getType(), + data.getGeometry(), // geoUid 없음 + data.getProperties()); + } + } + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/ApiConfigEnum.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/ApiConfigEnum.java new file mode 100644 index 0000000..79cd405 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/ApiConfigEnum.java @@ -0,0 +1,22 @@ +package com.kamco.cd.kamcoback.enums; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +public class ApiConfigEnum { + + @Getter + @EqualsAndHashCode(of = "enumValue") + public static class EnumDto { + + private final T enumValue; + private final String id; + private final String text; + + public EnumDto(T enumValue, String id, String text) { + this.enumValue = enumValue; + this.id = id; + this.text = text; + } + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/CodeDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/CodeDto.java new file mode 100644 index 0000000..ae4bc00 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/CodeDto.java @@ -0,0 +1,20 @@ +package com.kamco.cd.kamcoback.enums; + +public class CodeDto { + + private String code; + private String name; + + public CodeDto(String code, String name) { + this.code = code; + this.name = name; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/CommonUseStatus.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/CommonUseStatus.java new file mode 100644 index 0000000..bcd0b39 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/CommonUseStatus.java @@ -0,0 +1,46 @@ +package com.kamco.cd.kamcoback.enums; + +import com.kamco.cd.kamcoback.enums.ApiConfigEnum.EnumDto; +import com.kamco.cd.kamcoback.inferface.EnumType; +import java.util.Arrays; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Common usage status used across the system. + * + *

This enum represents whether a resource is active, excluded from processing, or inactive. It + * is commonly used for filtering, business rules, and status management. + */ +@Getter +@AllArgsConstructor +public enum CommonUseStatus implements EnumType { + + // @formatter:off + USE("USE", "사용중", 100) + /** Actively used and available */ + , + EXCEPT("EXCEPT", "영구 추론제외", 200) + /** Explicitly excluded from use or processing */ + , + AUTO_EXCEPT("AUTO_EXCEPT", "자동추론 제외", 300), + NOT_USE("NOT_USE", "사용안함", 999) +/** Not used or disabled */ +; + // @formatter:on + + private String id; + private String text; + private int ordering; + + public static CommonUseStatus getEnumById(String id) { + return Arrays.stream(CommonUseStatus.values()) + .filter(x -> x.getId().equals(id)) + .findFirst() + .orElse(CommonUseStatus.NOT_USE); + } + + public EnumDto getEnumDto() { + return new EnumDto<>(this, this.id, this.text); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/Enums.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/Enums.java new file mode 100644 index 0000000..c87856e --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/Enums.java @@ -0,0 +1,86 @@ +package com.kamco.cd.kamcoback.enums; + +import com.kamco.cd.kamcoback.inferface.CodeExpose; +import com.kamco.cd.kamcoback.inferface.CodeHidden; +import com.kamco.cd.kamcoback.inferface.EnumType; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.reflections.Reflections; + +public class Enums { + + private static final String BASE_PACKAGE = "com.kamco.cd.kamcoback"; + + /** 노출 가능한 enum만 모아둔 맵 key: enum simpleName (예: RoleType) value: enum Class */ + private static final Map>> exposedEnumMap = scanExposedEnumMap(); + + // code로 enum 찾기 + public static & EnumType> E fromId(Class enumClass, String id) { + if (id == null) { + return null; + } + + for (E e : enumClass.getEnumConstants()) { + if (id.equalsIgnoreCase(e.getId())) { + return e; + } + } + return null; + } + + // enum -> CodeDto list + public static List toList(Class> enumClass) { + Object[] enums = enumClass.getEnumConstants(); + + return Arrays.stream(enums) + .map(e -> (EnumType) e) + .filter(e -> !isHidden(enumClass, (Enum) e)) + .map(e -> new CodeDto(e.getId(), e.getText())) + .toList(); + } + + private static boolean isHidden(Class> enumClass, Enum e) { + try { + return enumClass.getField(e.name()).isAnnotationPresent(CodeHidden.class); + } catch (NoSuchFieldException ex) { + return false; + } + } + + /** 특정 타입(enum)만 조회 /codes/{type} -> type = RoleType 같은 값 */ + public static List getCodes(String type) { + Class> enumClass = exposedEnumMap.get(type); + if (enumClass == null) { + throw new IllegalArgumentException("지원하지 않는 코드 타입: " + type); + } + return toList(enumClass); + } + + /** 전체 enum 코드 조회 */ + public static Map> getAllCodes() { + Map> result = new HashMap<>(); + for (Map.Entry>> e : exposedEnumMap.entrySet()) { + result.put(e.getKey(), toList(e.getValue())); + } + return result; + } + + /** CodeExpose + EnumType 인 enum만 스캔해서 Map 구성 */ + private static Map>> scanExposedEnumMap() { + Reflections reflections = new Reflections(BASE_PACKAGE); + + Set> types = reflections.getTypesAnnotatedWith(CodeExpose.class); + + Map>> result = new HashMap<>(); + + for (Class clazz : types) { + if (clazz.isEnum() && EnumType.class.isAssignableFrom(clazz)) { + result.put(clazz.getSimpleName(), (Class>) clazz); + } + } + return result; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/ImageryFitStatus.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/ImageryFitStatus.java new file mode 100644 index 0000000..5d878b9 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/ImageryFitStatus.java @@ -0,0 +1,43 @@ +package com.kamco.cd.kamcoback.enums; + +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import java.util.Arrays; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@CodeExpose +@Getter +@AllArgsConstructor +public enum ImageryFitStatus implements EnumType { + FIT("적합"), + UNFIT("부적합"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + + public static ImageryFitStatus fromCode(String code) { + if (code == null) { + return null; + } + String c = code.trim(); + return Arrays.stream(values()) + .filter(v -> v.name().equalsIgnoreCase(c)) + .findFirst() + .orElse(null); + } + + public static String getDescByCode(String code) { + ImageryFitStatus status = fromCode(code); + return status != null ? status.getDesc() : null; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/MngStateType.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/MngStateType.java new file mode 100644 index 0000000..f5fd245 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/MngStateType.java @@ -0,0 +1,26 @@ +package com.kamco.cd.kamcoback.enums; + +import com.kamco.cd.kamcoback.inferface.EnumType; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum MngStateType implements EnumType { + NOTYET("동기화 시작"), + PROCESSING("데이터 체크"), + DONE("동기화 작업 종료"), + TAKINGERROR("오류 데이터 처리중"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/SyncStateType.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/SyncStateType.java new file mode 100644 index 0000000..adba1cc --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/enums/SyncStateType.java @@ -0,0 +1,33 @@ +package com.kamco.cd.kamcoback.enums; + +import com.kamco.cd.kamcoback.inferface.CodeExpose; +import com.kamco.cd.kamcoback.inferface.CodeHidden; +import com.kamco.cd.kamcoback.inferface.EnumType; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@CodeExpose +@Getter +@AllArgsConstructor +public enum SyncStateType implements EnumType { + @CodeHidden + NOTYET("미처리"), + NOFILE("파일없음"), + NOTPAIR("페어파일누락"), + DUPLICATE("파일중복"), + TYPEERROR("손상파일"), + @CodeHidden + DONE("완료"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.java new file mode 100644 index 0000000..1e11806 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectContDto.java @@ -0,0 +1,151 @@ +package com.kamco.cd.kamcoback.gukyuin.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +public class ChngDetectContDto { + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ContBasic { + + private String chnDtctMstId; // 탐지콘텐츠아이디 + private String chnDtctContId; // 탐지마스타아이디 + private String cprsYr; // 비교년도 2023 + private String crtrYr; // 기준년도 2024 + private String chnDtctSno; // 차수 (1 | 2 | ...) + private String mpqdNo; // 도엽번호 + private String chnDtctId; // 탐지아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성 + private String chnDtctObjtId; // 탐지객체아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성 + private String chnDtctPolygon; // 탐지객체폴리곤 + private String chnDtctSqms; // 탐지객체면적 + private String chnCd; // 변화코드 + private String chnDtctJson; // 변화탐지JSON + private String chnDtctProb; // 변화탐지정확도 + private String bfClsCd; // 이전부류코드 + private String bfClsProb; // 이전분류정확도 + private String afClsCd; // 이후분류코드 + private String afClsProb; // 이후분류정확도 + private String crtDt; // 생성일시 + private String crtEpno; // 생성사원번호 + private String crtIp; // 생성사원아이피 + private String delYn; // 삭제여부 + private String[] pnuList; // pnuList + private String reqEpno; // 요청사원번호 + private String reqIp; // 요청사원아이피 + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ChnDetectContReqDto { + + private String cprsYr; // 비교년도 2023 + private String crtrYr; // 기준년도 2024 + private String chnDtctSno; // 차수 (1 | 2 | ...) + private String mpqdNo; // 도엽번호 + private String chnDtctId; // 탐지아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성 + private String chnDtctObjtId; // 탐지객체아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성 + private String reqEpno; // 사원번호 + private String reqIp; + } + + @Schema(name = "ResReturn", description = "수행 후 리턴") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ResReturn { + + private String flag; + private String message; + } + + @Schema(name = "ResultContDto", description = "cont list 리턴 형태") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ResultContDto { + + private Integer code; + private String message; + private List result; + private Boolean success; + } + + @Schema(name = "DtoPnuDetectMpng", description = "PNU 결과 형태") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class DtoPnuDetectMpng { + + private String pnuDtctId; + private String lrmYmd; + private String pnu; + private String pnuSqms; + private String pnuDtctSqms; + + private String chnDtctSqms; + private String chnDtctMstId; + private String chnDtctContId; + private String chnDtctId; + private String chnDtctObjtId; + private String crtDt; + } + + @Schema(name = "ResultPnuDto", description = "pnu list 리턴 형태") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ResultPnuDto { + + private Integer code; + private String message; + private List result; + private Boolean success; + } + + @Schema(name = "ResultLabelDto", description = "ResultLabelDto list 리턴 형태") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ResultLabelDto { + + private Integer code; + private String message; + private DtoPnuDetectMpng result; + private Boolean success; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ReqInfo { + + private String reqIp; + private String reqEpno; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class StbltResult { + + private String stbltYn; + private String incyCd; + private String incyCmnt; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.java new file mode 100644 index 0000000..67ab78d --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/ChngDetectMastDto.java @@ -0,0 +1,304 @@ +package com.kamco.cd.kamcoback.gukyuin.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.time.ZonedDateTime; +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +public class ChngDetectMastDto { + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class Basic { + + private String chnDtctMstId; // 탐지마스터아이디 + private String cprsYr; // 비교년도 2023 + private String crtrYr; // 기준년도 2024 + private String chnDtctSno; // 차수 (1 | 2 | ...) + private String chnDtctId; // 탐지아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성 + private String chnDtctCnt; // 탐지객체개수 + private String pnuMpngCnt; // PNU매핑개수 + private String lrmYmd; // 지적도일자 + private String pathNm; // 탐지결과 절대경로명 /kamco_nas/export/{chnDtctId} + private List excnList; // 등록진행상태히스토리 (최근것부터 DESC) + private String excnStepCd; // 실행단계코드 + private String excnStep; // 실행단계코드에 해당하는 영문명 + private String excnPgrt; // 실행단계진행율 + private String excnBngnDt; // 실행단계시작시간 + private String excnEndDt; // 실행단계종료시간 + private String rmk; // 비고 + private String crtDt; // 생성일시 + private String crtEpno; // 생성사원번호 + private String crtIp; // 생성사원아이피 + private String chgDt; // 변경일시 + private String chgEpno; // 변경사원번호 + private String chgIp; // 변경사원아이피 + private String delYn; // 삭제여부 + // + private String reqEpno; // 요청사원번호 + private String reqIp; // 요청사원어이피 + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ChnDetectMastExcnStepDto { + + private String srno; // 일련번호 + private String chnDtctMstId; // 탐지마스터아이디 + private String excnStepCd; // 실행단계코드 + private String excnStep; // 실행단계코드에 해당하는 영문명 + private String excnPgrt; // 실행단계진행율 + private String excnEndDt; // 실행단계종료시간 + private String errCd; // 오류코드 + private String errMsg; // 오류메세지 + private String crtDt; // 실행단계시작시간 + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ChnDetectMastReqDto { + + @Schema(description = "비교년도", example = "2023") + private String cprsYr; + + @Schema(description = "기준년도", example = "2024") + private String crtrYr; + + @Schema(description = "차수", example = "1") + private String chnDtctSno; + + @Schema( + description = "탐지아이디, UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성", + example = "D5F192EC76D34F6592035BE63A84F591") + private String chnDtctId; + + @Schema( + description = "탐지결과 절대경로명 /kamco_nas/export/{chnDtctId}", + example = "/kamco-nfs/dataset/export/D5F192EC76D34F6592035BE63A84F591") + private String pathNm; + + @Schema(description = "사원번호", example = "123456") + private String reqEpno; + + @Schema(description = "사원아이피", example = "127.0.0.1") + private String reqIp; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ChnDetectContDto { + + private String chnDtctMstId; // 탐지콘텐츠아이디 + private String chnDtctContId; // 탐지마스타아이디 + private String cprsYr; // 비교년도 2023 + private String crtrYr; // 기준년도 2024 + private String chnDtctSno; // 차수 (1 | 2 | ...) + private String mpqdNo; // 도엽번호 + private String chnDtctId; // 탐지아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성 + private String chnDtctObjtId; // 탐지객체아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성 + private String chnDtctPolygon; // 탐지객체폴리곤 + private String chnDtctSqms; // 탐지객체면적 + private String chnCd; // 변화코드 + private String chnDtctJson; // 변화탐지JSON + private String chnDtctProb; // 변화탐지정확도 + private String bfClsCd; // 이전부류코드 + private String bfClsProb; // 이전분류정확도 + private String afClsCd; // 이후분류코드 + private String afClsProb; // 이후분류정확도 + private String crtDt; // 생성일시 + private String crtEpno; // 생성사원번호 + private String crtIp; // 생성사원아이피 + private String delYn; // 삭제여부 + // + private String reqEpno; // 요청사원번호 + private String reqIp; // 요청사원아이피 + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ChnDetectContReqDto { + + private String cprsYr; // 비교년도 2023 + private String crtrYr; // 기준년도 2024 + private String chnDtctSno; // 차수 (1 | 2 | ...) + private String mpqdNo; // 도엽번호 + private String chnDtctId; // 탐지아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성 + private String chnDtctObjtId; // 탐지객체아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성 + private String reqEpno; // 사원번호 + private String reqIp; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ChngDetectMastSearchDto { + + // private String chnDtctId; + private String cprsYr; + private String crtrYr; + private String chnDtctSno; + } + + @Schema(name = "ResReturn", description = "수행 후 리턴") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ResReturn { + + private String flag; + private String message; + } + + @Schema(name = "ResultDto", description = "mast list 리턴 형태") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ResultDto { + + private Integer code; + private String message; + private List result; + private Boolean success; + } + + @Schema(name = "RegistResDto", description = "reg 등록 후 리턴 형태") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class RegistResDto { + + private Integer code; + private String message; + private Basic result; + private Boolean success; + } + + @Schema(name = "LearnKeyDto", description = "learn 엔티티 key 정보") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class LearnKeyDto { + + private Long id; + private String uid; + private String chnDtctMstId; + } + + @Schema(name = "LabelSendDto", description = "라벨링 전송한 목록") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class LabelSendDto { + + private String chnDtctObjtId; + private String labelerId; + private ZonedDateTime labelerWorkDttm; + private String reviewerId; + private ZonedDateTime reviewerWorkDttm; + private ZonedDateTime labelSendDttm; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class ErrorResDto { + + private String timestamp; + private Integer status; + private String error; + private String path; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class RlbDtctDto { + + private Integer code; + private String message; + private List result; + private Boolean success; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class RlbDtctMastDto { + + private String pnuDtctId; // PNU탐지ID + private String pnu; // PNU코드(19자리) + private String lrmSyncYmd; // 지적도동기화일자(YYYYMMDD) + private String pnuSyncYmd; // PNU동기화일자(YYYYMMDD) + private String mpqdNo; // 도곽번호 + private String cprsYr; // 비교년도 + private String crtrYr; // 기준년도 + private String chnDtctSno; // 회차, 변화탐지순번 + private String chnDtctId; // 변화탐지ID(UUID) + + private String chnDtctMstId; // 변화탐지마스터ID + private String chnDtctObjtId; // 변화탐지객체ID + private String chnDtctContId; // 변화탐지내용ID + private String chnCd; // 변화코드 + private String chnDtctProb; // 변화탐지정확도(0~1) + + private String bfClsCd; // 이전분류코드 + private String bfClsProb; // 이전분류정확도(0~1) + private String afClsCd; // 이후분류코드 + private String afClsProb; // 이후분류정확도(0~1) + + private String pnuSqms; // PNU면적(㎡) + private String pnuDtctSqms; // PNU탐지면적(㎡) + private String chnDtctSqms; // 변화탐지면적(㎡) + private String stbltYn; // 적합여부(Y/N) - 안정성 (Y:부적합, N:적합) + private String incyCd; // 부적합코드 + private String incyRsnCont; // 부적합사유내용 + private String lockYn; // 잠금여부(Y/N) + private String lblYn; // 라벨여부(Y/N) + private String chgYn; // 변경여부(Y/N) + private String rsatctNo; // 부동산등기번호 + private String rmk; // 비고 + + private String crtDt; // 생성일시 + private String crtEpno; // 생성사원번호 + private String crtIp; // 생성사원아이피 + private String chgDt; // 변경일시 + private String chgEpno; // 변경자사번 + private String chgIp; // 변경자IP + private String delYn; // 삭제여부 + } + + @Schema(name = "RemoveResDto", description = "remove 후 리턴 형태") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class RemoveResDto { + + private Integer code; + private String message; + private Boolean result; + private Boolean success; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto.java new file mode 100644 index 0000000..59c6e86 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/DetectMastDto.java @@ -0,0 +1,80 @@ +package com.kamco.cd.kamcoback.gukyuin.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; +import lombok.Setter; + +public class DetectMastDto { + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class Basic { + + private Long dtctMstId; + private String cprsBfYr; + private String cprsAdYr; + private Integer dtctSno; + private String pathNm; + private String crtEpno; + private String crtIp; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class DetectMastReq { + + @NotBlank + @Schema(description = "before 연도", example = "2023") + private String cprsBfYr; + + @NotBlank + @Schema(description = "after 연도", example = "2024") + private String cprsAdYr; + + @NotNull + @Schema(description = "차수(회차)", example = "4") + private Integer dtctSno; + + @NotBlank + @Schema(description = "파일경로", example = "/app/detect/result/2023_2024/4") + private String pathNm; + + @NotBlank + @Schema(description = "사원번호", example = "1234567") + private String crtEpno; + + @NotBlank + @Schema(description = "아이피", example = "0.0.0.0") + private String crtIp; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class DetectMastSearch { + + private String cprsBfYr; + private String cprsAdYr; + private Integer dtctSno; + private String featureId; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class FeaturePnuDto { + + private String featureId; // polygon_id + private String pnu; // 랜덤 생성 + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto.java new file mode 100644 index 0000000..da25f65 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinDto.java @@ -0,0 +1,77 @@ +package com.kamco.cd.kamcoback.gukyuin.dto; + +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +public class GukYuinDto { + + /** 실패 코드 enum */ + @Getter + @AllArgsConstructor + public enum GukYuinLinkFailCode implements EnumType { + OK("연동 가능"), + NOT_FOUND("대상 회차가 없습니다."), + SCOPE_PART_NOT_ALLOWED("부분 도엽은 연동 불가능 합니다."), + HAS_RUNNING_INFERENCE("라벨링 진행 중 회차가 있습니다."), + OTHER_GUKYUIN_IN_PROGRESS("국유in 연동 진행 중 회차가 있습니다."); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + } + + @Getter + @Setter + public static class GukYuinLinkableRes { + + private boolean linkable; + // private GukYuinLinkFailCode code; + private String message; + } + + // Repository가 반환할 Fact(조회 결과) + public record GukYuinLinkFacts( + boolean existsLearn, + boolean isPartScope, + boolean hasRunningInference, + boolean hasOtherUnfinishedGukYuin) {} + + @Getter + @Setter + @AllArgsConstructor + public static class LearnInfo { + + private Long id; + private UUID uuid; + private Integer compareYyyy; + private Integer targetYyyy; + private Integer stage; + private String uid; + private String applyStatus; + private Boolean applyYn; + + public Boolean getApplyYn() { + return this.applyYn != null && this.applyYn; + } + } + + @Getter + @Setter + @AllArgsConstructor + public static class GeomUidDto { + + private Long geoUid; + private String resultUid; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinStatus.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinStatus.java new file mode 100644 index 0000000..16b22e4 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/gukyuin/dto/GukYuinStatus.java @@ -0,0 +1,29 @@ +package com.kamco.cd.kamcoback.gukyuin.dto; + +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum GukYuinStatus implements EnumType { + PENDING("대기"), + IN_PROGRESS("진행중"), + GUK_COMPLETED("국유인 매핑 완료"), + PNU_COMPLETED("PNU 싱크 완료"), + PNU_FAILED("PNU 싱크 중 에러"), + END("종료"), + CANCELED("취소"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inference/dto/DetectionClassification.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inference/dto/DetectionClassification.java new file mode 100644 index 0000000..d2a1330 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inference/dto/DetectionClassification.java @@ -0,0 +1,56 @@ +package com.kamco.cd.kamcoback.inference.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum DetectionClassification { + ROAD("road", "도로", 10), + BUILDING("building", "건물", 20), + GREENHOUSE("greenhouse", "비닐하우스", 30), + FIELD("field", "논/밭", 40), + ORCHARD("orchard", "과수원", 50), + GRASS("grass", "초지", 60), + FOREST("forest", "숲", 70), + WATER("water", "물", 80), + STONE("stone", "모래/자갈", 90), + WASTE("waste", "적치물", 100), + CONTAINER("container", "컨테이너", 110), + LAND("land", "일반토지", 120), + SOLAR("solar", "태양광", 130), + TANK("tank", "물탱크", 140), + NDC("NDC", "미분류", 150), + ETC("ETC", "기타", 160); + + private final String id; + private final String desc; + private final int order; + + /** + * Optional: Helper method to get the enum from a String, case-insensitive, or return ETC if not + * found. + */ + public static DetectionClassification fromString(String text) { + if (text == null || text.trim().isEmpty()) { + return ETC; + } + + try { + return DetectionClassification.valueOf(text.toUpperCase()); + } catch (IllegalArgumentException e) { + // If the string doesn't match any enum constant name, return ETC + return ETC; + } + } + + /** + * Desc 한글명 get 하기 + * + * @return + */ + public static String fromStrDesc(String text) { + DetectionClassification dtf = fromString(text); + return dtf.getDesc(); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java new file mode 100644 index 0000000..4cfe330 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java @@ -0,0 +1,561 @@ +package com.kamco.cd.kamcoback.inference.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.kamco.cd.kamcoback.common.utils.enums.ImageryFitStatus; +import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; +import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.DetectOption; +import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto.MapSheetScope; +import io.swagger.v3.oas.annotations.media.Schema; +import java.time.Duration; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +public class InferenceDetailDto { + + @Schema(name = "InferenceResultBasic", description = "분석결과 기본 정보") + @Getter + public static class Basic { + + private Long id; + private String dataName; + private Long mapSheepNum; + private Long detectingCnt; + @JsonFormatDttm private ZonedDateTime analStrtDttm; + @JsonFormatDttm private ZonedDateTime analEndDttm; + private Long analSec; + private String analState; + + public Basic( + Long id, + String dataName, + Long mapSheepNum, + Long detectingCnt, + ZonedDateTime analStrtDttm, + ZonedDateTime analEndDttm, + Long analSec, + String analState) { + this.id = id; + this.dataName = dataName; + this.mapSheepNum = mapSheepNum; + this.detectingCnt = detectingCnt; + this.analStrtDttm = analStrtDttm; + this.analEndDttm = analEndDttm; + this.analSec = analSec; + this.analState = analState; + } + } + + @Schema(name = "AnalysisResultList", description = "분석결과 목록") + @Getter + public static class AnalResList { + + private Long id; + private String analTitle; + private Long detectingCnt; + @JsonFormatDttm private ZonedDateTime analStrtDttm; + @JsonFormatDttm private ZonedDateTime analEndDttm; + private Long analSec; + private Long analPredSec; + private String analState; + private String analStateNm; + private String gukyuinUsed; + + public AnalResList( + Long id, + String analTitle, + Long detectingCnt, + ZonedDateTime analStrtDttm, + ZonedDateTime analEndDttm, + Long analSec, + Long analPredSec, + String analState, + String analStateNm, + String gukyuinUsed) { + this.id = id; + this.analTitle = analTitle; + this.detectingCnt = detectingCnt; + this.analStrtDttm = analStrtDttm; + this.analEndDttm = analEndDttm; + this.analSec = analSec; + this.analPredSec = analPredSec; + this.analState = analState; + this.analStateNm = analStateNm; + this.gukyuinUsed = gukyuinUsed; + } + } + + @Schema(name = "AnalysisResultSummary", description = "분석결과 요약정보") + @Getter + public static class AnalResSummary { + + private Long id; + private String analTitle; + private String modelInfo; + private Integer targetYyyy; + private Integer compareYyyy; + @JsonFormatDttm private ZonedDateTime analStrtDttm; + @JsonFormatDttm private ZonedDateTime analEndDttm; + private Long analSec; + private Long analPredSec; + private String resultUrl; + private Long detectingCnt; + private Double accuracy; + private String analState; + private String analStateNm; + + public AnalResSummary( + Long id, + String analTitle, + String modelInfo, + Integer targetYyyy, + Integer compareYyyy, + ZonedDateTime analStrtDttm, + ZonedDateTime analEndDttm, + Long analSec, + Long analPredSec, + String resultUrl, + Long detectingCnt, + Double accuracy, + String analState, + String analStateNm) { + this.id = id; + this.analTitle = analTitle; + this.modelInfo = modelInfo; + this.targetYyyy = targetYyyy; + this.compareYyyy = compareYyyy; + this.analStrtDttm = analStrtDttm; + this.analEndDttm = analEndDttm; + this.analSec = analSec; + this.analPredSec = analPredSec; + this.resultUrl = resultUrl; + this.detectingCnt = detectingCnt; + this.accuracy = accuracy; + this.analState = analState; + this.analStateNm = analStateNm; + } + } + + @Getter + public static class Dashboard { + + String classAfterCd; + String classAfterName; + Long classAfterCnt; + + public Dashboard(String classAfterCd, Long classAfterCnt) { + this.classAfterCd = classAfterCd; + this.classAfterName = DetectionClassification.fromString(classAfterCd).getDesc(); + this.classAfterCnt = classAfterCnt; + } + } + + @Getter + public static class Detail { + + AnalResSummary summary; + List dashboard; + Long totalCnt; + + public Detail(AnalResSummary summary, List dashboard, Long totalCnt) { + this.summary = summary; + this.dashboard = dashboard; + this.totalCnt = totalCnt; + } + } + + // 분석 상세 ROW + @Getter + @AllArgsConstructor + public static class DetailListEntity { + + private Uid code; + private Double detectionScore; + private Clazzes compare; + private Clazzes target; + private MapSheet mapSheet; + private Coordinate center; + @JsonFormatDttm private ZonedDateTime updatedDttm; + + public DetailListEntity( + UUID uuid, + Double detectionScore, + Clazzes compare, + Clazzes target, + MapSheet mapSheet, + Coordinate center, + ZonedDateTime updatedDttm) { + this.code = new Uid(uuid); + this.detectionScore = detectionScore; + this.compare = compare; + this.target = target; + this.mapSheet = mapSheet; + this.center = center; + this.updatedDttm = updatedDttm; + } + } + + @Getter + @AllArgsConstructor + public static class Uid { + + private String shortCode; + private String code; + + public Uid(UUID uuid) { + if (uuid != null) { + this.shortCode = uuid.toString().substring(0, 8).toUpperCase(); + this.code = uuid.toString(); + } + } + } + + // MAP NO + @Getter + @AllArgsConstructor + public static class MapSheet { + + private String number; + private String name; + } + + // classification info + @Getter + public static class Clazz { + + private String code; + private String name; + @JsonIgnore private Double score; + + public Clazz(String code, Double score) { + this.code = code; + this.score = score; + this.name = DetectionClassification.fromString(code).getDesc(); + } + + public Clazz(String code) { + this.code = code; + this.name = DetectionClassification.fromString(code).getDesc(); + } + } + + // classification info + @Getter + public static class Clazzes { + + private DetectionClassification code; + private String name; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private Double score; + + private Integer order; + + public Clazzes(DetectionClassification classification, Double score) { + this.code = classification; + this.name = classification.getDesc(); + this.order = classification.getOrder(); + this.score = score; + } + + public Clazzes(DetectionClassification classification) { + this.code = classification; + this.name = classification.getDesc(); + this.order = classification.getOrder(); + } + } + + // 좌표 정보 point + @Getter + public static class Coordinate { + + private Double lon; // 경도(Longitude) + private Double lat; // 위도(Latitude) + private String srid; // Spatial Reference ID의 약자로, 데이터베이스에서 좌표계를 식별하는 고유 번호 추후enum으로 + + public Coordinate(Double lon, Double lat) { + this.lon = lon; + this.lat = lat; + this.srid = "EPSG:4326"; + } + } + + @Getter + public static class Geom { + + UUID uuid; + String uid; + Integer compareYyyy; + Integer targetYyyy; + Double cdProb; + String classBeforeCd; + String classBeforeName; + Double classBeforeProb; + String classAfterCd; + String classAfterName; + Double classAfterProb; + Long mapSheetNum; + String mapSheetName; + String subUid; + String pnu; + String fitState; + + public Geom( + UUID uuid, + String uid, + Integer compareYyyy, + Integer targetYyyy, + Double cdProb, + String classBeforeCd, + Double classBeforeProb, + String classAfterCd, + Double classAfterProb, + Long mapSheetNum, + String mapSheetName, + String subUid, + String pnu, + String fitState) { + this.uuid = uuid; + this.uid = uid; + this.compareYyyy = compareYyyy; + this.targetYyyy = targetYyyy; + this.cdProb = cdProb; + this.classBeforeCd = classBeforeCd; + this.classBeforeName = DetectionClassification.fromString(classBeforeCd).getDesc(); + this.classBeforeProb = classBeforeProb; + this.classAfterCd = classAfterCd; + this.classAfterName = DetectionClassification.fromString(classAfterCd).getDesc(); + this.classAfterProb = classAfterProb; + this.mapSheetNum = mapSheetNum; + this.mapSheetName = mapSheetName; + this.subUid = subUid; + this.pnu = pnu; + this.fitState = fitState; + } + + @JsonProperty("fitState") + public String getFitState() { + return this.fitState == null ? null : this.fitState; + } + + // @JsonIgnore String gemoStr; + // @JsonIgnore String geomCenterStr; + // JsonNode gemo; + // JsonNode geomCenter; + + @JsonProperty("fitStateName") + public String fitStateName() { + return ImageryFitStatus.getDescByCode(this.fitState); + } + } + + @Schema(name = "InferenceResultSearchReq", description = "분석결과 목록 요청 정보") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class SearchReq { + + // 검색 조건 + private String statCode; + private String title; + + // 페이징 파라미터 + private int page = 0; + private int size = 20; + + public Pageable toPageable() { + return PageRequest.of(page, size); + } + } + + @Schema(name = "InferenceResultSearchReq", description = "분석결과 목록 요청 정보") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class SearchGeoReq { + + // 기준년도 + private String targetClass; + // 비교년도 + private String compareClass; + // 분석도엽 + private Long mapSheetNum; + + // 페이징 파라미터 + private int page = 0; + private int size = 20; + private String sort; + + public Pageable toPageable() { + if (sort != null && !sort.isEmpty()) { + String[] sortParams = sort.split(","); + String property = sortParams[0]; + Sort.Direction direction = + sortParams.length > 1 ? Sort.Direction.fromString(sortParams[1]) : Sort.Direction.ASC; + return PageRequest.of(page, size, Sort.by(direction, property)); + } + return PageRequest.of(page, size); + } + } + + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + 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; + private String uid; + } + + @Schema(name = "AnalResultInfo", description = "추론결과 기본정보") + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class AnalResultInfo { + + private String analTitle; + private String modelVer1; + private String modelVer2; + private String modelVer3; + private Integer compareYyyy; + private Integer targetYyyy; + private String detectOption; + private String mapSheetScope; + @JsonFormatDttm private ZonedDateTime inferStartDttm; + @JsonFormatDttm private ZonedDateTime inferEndDttm; + private Integer stage; + private String elapsedDuration; + private String subUid; + private Boolean applyYn; + @JsonFormatDttm private ZonedDateTime applyDttm; + + private String bboxGeom; + private String bboxCenterPoint; + private UUID inferenceUuid; + + public AnalResultInfo( + String analTitle, + String modelVer1, + String modelVer2, + String modelVer3, + Integer compareYyyy, + Integer targetYyyy, + String detectOption, + String mapSheetScope, + ZonedDateTime inferStartDttm, + ZonedDateTime inferEndDttm, + Integer stage, + String subUid, + Boolean applyYn, + ZonedDateTime applyDttm, + UUID inferenceUuid) { + this.analTitle = analTitle; + this.modelVer1 = modelVer1; + this.modelVer2 = modelVer2; + this.modelVer3 = modelVer3; + this.compareYyyy = compareYyyy; + this.targetYyyy = targetYyyy; + this.detectOption = DetectOption.getDescByCode(detectOption); + this.mapSheetScope = MapSheetScope.getDescByCode(mapSheetScope); + this.inferStartDttm = inferStartDttm; + this.inferEndDttm = inferEndDttm; + this.stage = stage; + this.subUid = subUid; + this.applyYn = applyYn; + this.applyDttm = applyDttm; + Duration elapsed = + (inferStartDttm != null && inferEndDttm != null) + ? Duration.between(inferStartDttm, inferEndDttm) + : null; + + if (elapsed != null) { + long seconds = elapsed.getSeconds(); + long abs = Math.abs(seconds); + + long h = abs / 3600; + long m = (abs % 3600) / 60; + long s = abs % 60; + + this.elapsedDuration = String.format("%02d:%02d:%02d", h, m, s); + } + this.inferenceUuid = inferenceUuid; + } + + @JsonProperty("bboxGeom") + public JsonNode getBboxGeom() { + ObjectMapper mapper = new ObjectMapper(); + try { + if (this.bboxGeom != null) { + return mapper.readTree(this.bboxGeom); + } else { + return null; + } + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + @JsonProperty("bboxCenterPoint") + public JsonNode getBboxCenterPoint() { + ObjectMapper mapper = new ObjectMapper(); + try { + if (this.bboxCenterPoint != null) { + return mapper.readTree(this.bboxCenterPoint); + } else { + return null; + } + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + public Boolean getApplyYn() { + return this.applyYn != null && this.applyYn; + } + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class BboxPointDto { + + private String bboxGeom; + private String bboxCenterPoint; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class Scene { + + private String path; + private Integer size; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java new file mode 100644 index 0000000..2ee0526 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java @@ -0,0 +1,679 @@ +package com.kamco.cd.kamcoback.inference.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import com.kamco.cd.kamcoback.common.utils.interfaces.EnumValid; +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; +import java.util.List; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +public class InferenceResultDto { + + /** 분석대상 도엽 enum */ + @Getter + @AllArgsConstructor + public enum MapSheetScope implements EnumType { + ALL("전체"), + PART("부분"), + ; + + private final String desc; + + public static MapSheetScope fromCode(String code) { + return Arrays.stream(values()).filter(v -> v.name().equals(code)).findFirst().orElse(null); + } + + public static String getDescByCode(String code) { + return fromCode(code).getDesc(); + } + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + } + + /** 탐지 데이터 옵션 dto */ + @Getter + @AllArgsConstructor + public enum DetectOption implements EnumType { + EXCL("추론제외"), + PREV("이전 년도 도엽 사용"), + ; + private final String desc; + + public static DetectOption fromCode(String code) { + return Arrays.stream(values()).filter(v -> v.name().equals(code)).findFirst().orElse(null); + } + + public static String getDescByCode(String code) { + return fromCode(code).getDesc(); + } + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + } + + @Getter + @AllArgsConstructor + public enum Status implements EnumType { + READY("대기"), + IN_PROGRESS("진행중"), + END("완료"), + FORCED_END("강제종료"); + private final String desc; + + public static Status fromCode(String code) { + return Arrays.stream(values()).filter(v -> v.name().equals(code)).findFirst().orElse(null); + } + + public static String getDescByCode(String code) { + return fromCode(code).getDesc(); + } + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + } + + @Getter + @AllArgsConstructor + public enum ServerStatus implements EnumType { + SAFETY("원활"), + CAUTION("주의"), + FAILUR("장애"), + ; + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } + } + + /** 목록조회 dto */ + @Schema(name = "ResultList", description = "추론관리 목록") + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class ResultList { + + private UUID uuid; + + @Schema(description = "제목") + private String title; + + @Schema(description = "회차") + private Integer stage; + + @Schema(description = "상태") + private String status; + + @Schema(description = "분석 도엽") + private String mapSheetCnt; + + @Schema(description = "탐지건수") + private Long detectingCnt; + + @Schema(description = "시작일시") + @JsonFormatDttm + private ZonedDateTime startTime; + + @Schema(description = "종료일시") + @JsonFormatDttm + private ZonedDateTime endTime; + + @Schema(description = "반영여부") + private Boolean applyYn; + + @Schema(description = "반영일시") + @JsonFormatDttm + private ZonedDateTime applyDttm; + + @Schema(description = "비교년도") + private Integer compareYyyy; + + @Schema(description = "기준년도") + private Integer targetYyyy; + + @Schema(description = "uid") + private String uid; + + @Schema(description = "uid 앞 8자리") + @JsonProperty("subUid") + public String subUid() { + return this.uid.substring(0, 8).toUpperCase(); + } + + @Schema(description = "상태명") + @JsonProperty("statusName") + public String statusName() { + return Status.getDescByCode(this.status); + } + + @Schema(description = "소요시간") + @JsonProperty("elapsedTim") + public String getElapsedTime() { + if (this.startTime == null || this.endTime == null) { + return null; + } + ZonedDateTime start = this.startTime; + ZonedDateTime end = this.endTime; + Duration d = Duration.between(start, end); + + if (d.isNegative()) { + d = d.negated(); + } + + long s = d.getSeconds(); + long h = s / 3600; + long m = (s % 3600) / 60; + long sec = s % 60; + + return String.format("%d시간 %d분 %d초", h, m, sec); + } + } + + /** 목록조회 검색 조건 dto */ + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class SearchListReq { + + // 검색 조건 + private String applyYn; + private LocalDate strtDttm; + private LocalDate endDttm; + private String title; + + // 페이징 파라미터 + private int page = 0; + private int size = 20; + + public Pageable toPageable() { + return PageRequest.of(page, size); + } + } + + /** 변화탐지 실행 정보 저장 요청 정보 */ + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class RegReq { + + @Schema(description = "제목", example = "2023-2024 변화탐지 테스트") + @NotBlank + private String title; + + @Schema(description = "M1", example = "b40e0f68-c1d8-49fc-93f9-a36270093861") + @NotNull + private UUID model1Uuid; + + @Schema(description = "M2", example = "ec92b7d2-b5a3-4915-9bdf-35fb3ca8ad27") + @NotNull + private UUID model2Uuid; + + @Schema(description = "M3", example = "37f45782-8ccf-4cf6-911c-a055a1510d39") + @NotNull + private UUID model3Uuid; + + @Schema(description = "비교년도", example = "2023") + @NotNull + private Integer compareYyyy; + + @Schema(description = "탐지년도", example = "2024") + @NotNull + private Integer targetYyyy; + + @Schema(description = "분석대상 도엽 - 전체(ALL), 부분(PART)", example = "PART") + @NotBlank + @EnumValid(enumClass = MapSheetScope.class, message = "분석대상 도엽 옵션은 '전체', '부분' 만 사용 가능합니다.") + private String mapSheetScope; + + @Schema(description = "탐지 데이터 옵션 - 추론제외(EXCL), 이전 년도 도엽 사용(PREV)", example = "EXCL") + @NotBlank + @EnumValid( + enumClass = DetectOption.class, + message = "탐지 데이터 옵션은 '추론제외', '이전 년도 도엽 사용' 만 사용 가능합니다.") + private String detectOption; + + @Schema(description = "5k 도협 번호 목록", example = "[33605,33606, 33610, 34802, 35603, 35611]") + @NotNull + private List mapSheetNum; + } + + @Getter + @Setter + public static class MapSheetNumDto { + + private String mapSheetNum; + private String mapSheetName; + } + + @Getter + @Setter + @NoArgsConstructor + @Schema(name = "InferenceStatusDetailDto", description = "추론(변화탐지) 진행상태") + public static class InferenceStatusDetailDto { + + @Schema(description = "탐지대상 도엽수") + private Long detectingCnt; + + @Schema(description = "모델1 분석 대기") + private Integer m1PendingJobs; + + @Schema(description = "모델2 분석 대기") + private Integer m2PendingJobs; + + @Schema(description = "모델3 분석 대기") + private Integer m3PendingJobs; + + @Schema(description = "모델1 분석 진행중") + private Integer m1RunningJobs; + + @Schema(description = "모델2 분석 진행중") + private Integer m2RunningJobs; + + @Schema(description = "모델3 분석 진행중") + private Integer m3RunningJobs; + + @Schema(description = "모델1 분석 완료") + private Integer m1CompletedJobs; + + @Schema(description = "모델2 분석 완료") + private Integer m2CompletedJobs; + + @Schema(description = "모델3 분석 완료") + private Integer m3CompletedJobs; + + @Schema(description = "모델1 분석 실패") + private Integer m1FailedJobs; + + @Schema(description = "모델2 분석 실패") + private Integer m2FailedJobs; + + @Schema(description = "모델3 분석 실패") + private Integer m3FailedJobs; + + @Schema(description = "모델1 사용시간 시작일시") + @JsonFormatDttm + ZonedDateTime m1ModelStartDttm; + + @Schema(description = "모델2 사용시간 시작일시") + @JsonFormatDttm + ZonedDateTime m2ModelStartDttm; + + @Schema(description = "모델3 사용시간 시작일시") + @JsonFormatDttm + ZonedDateTime m3ModelStartDttm; + + @Schema(description = "모델1 사용시간 종료일시") + @JsonFormatDttm + ZonedDateTime m1ModelEndDttm; + + @Schema(description = "모델2 사용시간 종료일시") + @JsonFormatDttm + ZonedDateTime m2ModelEndDttm; + + @Schema(description = "모델3 사용시간 종료일시") + @JsonFormatDttm + ZonedDateTime m3ModelEndDttm; + + @Schema(description = "변화탐지 제목") + private String title; + + @Schema(description = "비교년도") + private Integer compareYyyy; + + @Schema(description = "기준년도") + private Integer targetYyyy; + + @Schema(description = "회차") + private Integer stage; + + @Schema(description = "변화탐지 시작") + @JsonFormatDttm + private ZonedDateTime inferStartDttm; + + @Schema(description = "변화탐지 종료") + @JsonFormatDttm + private ZonedDateTime inferEndDttm; + + @Schema(description = "변화탐지 옵션") + private String detectOption; + + @Schema(description = "분석도엽") + private String mapSheetScope; + + @Schema(description = "모델1 버전") + private String modelVer1; + + @Schema(description = "모델2 버전") + private String modelVer2; + + @Schema(description = "모델3 버전") + private String modelVer3; + + @Schema(description = "탑지 도엽 수") + @JsonIgnore + private Long totalJobs; + + public InferenceStatusDetailDto( + Long detectingCnt, + Integer m1PendingJobs, + Integer m2PendingJobs, + Integer m3PendingJobs, + Integer m1RunningJobs, + Integer m2RunningJobs, + Integer m3RunningJobs, + Integer m1CompletedJobs, + Integer m2CompletedJobs, + Integer m3CompletedJobs, + Integer m1FailedJobs, + Integer m2FailedJobs, + Integer m3FailedJobs, + ZonedDateTime m1ModelStartDttm, + ZonedDateTime m2ModelStartDttm, + ZonedDateTime m3ModelStartDttm, + ZonedDateTime m1ModelEndDttm, + ZonedDateTime m2ModelEndDttm, + ZonedDateTime m3ModelEndDttm, + String title, + Integer compareYyyy, + Integer targetYyyy, + Integer stage, + ZonedDateTime inferStartDttm, + ZonedDateTime inferEndDttm, + String detectOption, + String mapSheetScope, + String modelVer1, + String modelVer2, + String modelVer3, + Long totalJobs) { + this.detectingCnt = detectingCnt; + this.m1PendingJobs = m1PendingJobs; + this.m2PendingJobs = m2PendingJobs; + this.m3PendingJobs = m3PendingJobs; + this.m1RunningJobs = m1RunningJobs; + this.m2RunningJobs = m2RunningJobs; + this.m3RunningJobs = m3RunningJobs; + this.m1CompletedJobs = m1CompletedJobs; + this.m2CompletedJobs = m2CompletedJobs; + this.m3CompletedJobs = m3CompletedJobs; + this.m1FailedJobs = m1FailedJobs; + this.m2FailedJobs = m2FailedJobs; + this.m3FailedJobs = m3FailedJobs; + this.m1ModelStartDttm = m1ModelStartDttm; + this.m2ModelStartDttm = m2ModelStartDttm; + this.m3ModelStartDttm = m3ModelStartDttm; + this.m1ModelEndDttm = m1ModelEndDttm; + this.m2ModelEndDttm = m2ModelEndDttm; + this.m3ModelEndDttm = m3ModelEndDttm; + this.title = title; + this.compareYyyy = compareYyyy; + this.targetYyyy = targetYyyy; + this.stage = stage; + this.inferStartDttm = inferStartDttm; + this.inferEndDttm = inferEndDttm; + this.detectOption = detectOption; + this.mapSheetScope = mapSheetScope; + this.modelVer1 = modelVer1; + this.modelVer2 = modelVer2; + this.modelVer3 = modelVer3; + this.totalJobs = totalJobs; + } + + @Schema(description = "진행률") + @JsonProperty("progress") + private int getProgress() { + long tiles = this.totalJobs == null ? 0L : this.totalJobs; // 도엽수 + int models = 3; // 모델 개수 + int completed = + this.m1CompletedJobs + + this.m2CompletedJobs + + this.m3CompletedJobs + + this.m1FailedJobs + + this.m2FailedJobs + + this.m3FailedJobs; // 완료수 + + long total = tiles * models; // 전체 작업량 + if (completed >= total) { + return 100; + } + return (int) ((completed * 100L) / total); + } + + @Schema(description = "변화탐지 옵션명") + @JsonProperty("detectOptionName") + private String getDetectOptionName() { + return DetectOption.getDescByCode(this.detectOption); + } + + @Schema(description = "분석도엽 명") + @JsonProperty("mapSheetScopeName") + private String getMapSheetScopeName() { + return MapSheetScope.getDescByCode(this.mapSheetScope); + } + + @Schema(description = "M1 사용시간") + @JsonProperty("m1ElapsedTim") + public String getM1ElapsedTime() { + return formatElapsedTime(this.m1ModelStartDttm, this.m1ModelEndDttm); + } + + @Schema(description = "M2 사용시간") + @JsonProperty("m2ElapsedTim") + public String getM2ElapsedTime() { + return formatElapsedTime(this.m2ModelStartDttm, this.m2ModelEndDttm); + } + + @Schema(description = "M3 사용시간") + @JsonProperty("m3ElapsedTim") + public String getM3ElapsedTime() { + return formatElapsedTime(this.m3ModelStartDttm, this.m3ModelEndDttm); + } + + private String formatElapsedTime(ZonedDateTime start, ZonedDateTime end) { + if (start == null || end == null) { + return null; + } + + Duration d = Duration.between(start, end); + if (d.isNegative()) { + d = d.negated(); + } + + long s = d.getSeconds(); + long h = s / 3600; + long m = (s % 3600) / 60; + long sec = s % 60; + + return String.format("%d시간 %d분 %d초", h, m, sec); + } + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class InferenceServerStatusDto { + + private String serverName; + @JsonIgnore private float cpu_user; + @JsonIgnore private float cpu_system; + @JsonIgnore private float memused; + private Long kbmemused; + private float gpuUtil; + + // private String cpuStatusName; + // private String memStatusName; + // private String gpuStatusName; + // private float cpu_use_rate; + // private float gpu_use_rate; + // private float mem_use_rate; + + public float getCpuUseRate() { + return this.cpu_user + this.cpu_system; + } + + public String getServerStatus() { + String enumId = "SAFETY"; + if (this.cpu_user + this.cpu_system + this.gpuUtil + this.kbmemused == 0) { + enumId = "FAILUR"; + } + // if( this.cpu_user+this.cpu_system >= 80 )enumId = "CAUTION"; + return enumId; + } + + public String getServerStatusName() { + String enumStr = ServerStatus.SAFETY.getText(); + if (this.cpu_user + this.cpu_system + this.gpuUtil + this.kbmemused == 0) { + enumStr = ServerStatus.FAILUR.getText(); + } + return enumStr; + } + + public String getCpuStatus() { + String enumId = "SAFETY"; + if (this.cpu_user + this.cpu_system >= 80) { + enumId = "CAUTION"; + } else if (this.cpu_user + this.cpu_system + this.memused == 0) { + enumId = "FAILUR"; + } + return enumId; + } + + public String getGpuStatus() { + String enumId = "SAFETY"; + if (this.gpuUtil >= 80) { + enumId = "CAUTION"; + } else if (this.cpu_user + this.cpu_system == 0) { + enumId = "FAILUR"; + } + return enumId; + } + + public String getMemStatus() { + String enumId = "SAFETY"; + if (this.memused >= 80) { + enumId = "CAUTION"; + } else if (this.cpu_user + this.cpu_system + this.memused == 0) { + enumId = "FAILUR"; + } + return enumId; + } + + public String getCpuStatusName() { + if (this.cpu_user + this.cpu_system >= 80) { + return ServerStatus.CAUTION.getText(); + } else if (this.cpu_user + this.cpu_system + this.memused == 0) { + return ServerStatus.FAILUR.getText(); + } + return ServerStatus.SAFETY.getText(); + } + + public String getGpuStatusName() { + if (this.gpuUtil >= 80) { + return ServerStatus.CAUTION.getText(); + } else if (this.cpu_user + this.cpu_system + this.memused == 0) { + return ServerStatus.FAILUR.getText(); + } + return ServerStatus.SAFETY.getText(); + } + + public String getMemStatusName() { + if (this.memused >= 80) { + return ServerStatus.CAUTION.getText(); + } else if (this.cpu_user + this.cpu_system + this.memused == 0) { + return ServerStatus.FAILUR.getText(); + } + return ServerStatus.SAFETY.getText(); + } + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class InferenceStatusDetailDto2 { + + InferenceServerStatusDto serverStatus; + } + + @Getter + @Setter + @AllArgsConstructor + @NoArgsConstructor + public static class SaveInferenceAiDto { + + private UUID uuid; + private Long batchId; + 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; + private String runningModelType; + private Integer pendingJobs; + private Integer runningJobs; + private Integer completedJobs; + private Integer failedJobs; + } + + @Getter + @Setter + public static class InferenceLearnDto { + + private String uid; + private Long m1ModelBatchId; + private Long m2ModelBatchId; + private Long m3ModelBatchId; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inferface/CodeExpose.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inferface/CodeExpose.java new file mode 100644 index 0000000..aa50c0e --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inferface/CodeExpose.java @@ -0,0 +1,10 @@ +package com.kamco.cd.kamcoback.inferface; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface CodeExpose {} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inferface/CodeHidden.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inferface/CodeHidden.java new file mode 100644 index 0000000..7516dfe --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inferface/CodeHidden.java @@ -0,0 +1,10 @@ +package com.kamco.cd.kamcoback.inferface; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface CodeHidden {} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inferface/EnumType.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inferface/EnumType.java new file mode 100644 index 0000000..2fa5f21 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inferface/EnumType.java @@ -0,0 +1,8 @@ +package com.kamco.cd.kamcoback.inferface; + +public interface EnumType { + + String getId(); + + String getText(); +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inferface/JsonFormatDttm.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inferface/JsonFormatDttm.java new file mode 100644 index 0000000..aabb352 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/inferface/JsonFormatDttm.java @@ -0,0 +1,19 @@ +package com.kamco.cd.kamcoback.inferface; + +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.FIELD, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@JacksonAnnotationsInside +@JsonFormat( + shape = JsonFormat.Shape.STRING, + pattern = "yyyy-MM-dd'T'HH:mm:ssXXX", + timezone = "Asia/Seoul") +public @interface JsonFormatDttm {} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/log/dto/EventStatus.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/log/dto/EventStatus.java new file mode 100644 index 0000000..1768945 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/log/dto/EventStatus.java @@ -0,0 +1,24 @@ +package com.kamco.cd.kamcoback.log.dto; + +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum EventStatus implements EnumType { + SUCCESS("이벤트 결과 성공"), + FAILED("이벤트 결과 실패"); + + private final String desc; + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/log/dto/EventType.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/log/dto/EventType.java new file mode 100644 index 0000000..891429f --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/log/dto/EventType.java @@ -0,0 +1,42 @@ +package com.kamco.cd.kamcoback.log.dto; + +import com.kamco.cd.kamcoback.common.utils.enums.CodeExpose; +import com.kamco.cd.kamcoback.common.utils.enums.EnumType; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@CodeExpose +@Getter +@AllArgsConstructor +public enum EventType implements EnumType { + LIST("목록"), + DETAIL("상세"), + POPUP("팝업"), + STATUS("상태"), + ADDED("추가"), + MODIFIED("수정"), + REMOVE("삭제"), + DOWNLOAD("다운로드"), + LOGIN("로그인"), + OTHER("기타"); + + private final String desc; + + public static EventType fromName(String name) { + try { + return EventType.valueOf(name.toUpperCase()); + } catch (Exception e) { + return OTHER; + } + } + + @Override + public String getId() { + return name(); + } + + @Override + public String getText() { + return desc; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.java new file mode 100644 index 0000000..ec0f0f6 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinCoreService.java @@ -0,0 +1,67 @@ +package com.kamco.cd.kamcoback.postgres.core; + +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.Basic; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LabelSendDto; +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.LearnInfo; +import com.kamco.cd.kamcoback.postgres.repository.gukyuin.GukYuinRepository; +import java.time.LocalDate; +import java.util.List; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class GukYuinCoreService { + + private final GukYuinRepository gukYuinRepository; + + public void updateGukYuinMastRegResult(Basic resultBody) { + gukYuinRepository.updateGukYuinMastRegResult(resultBody); + } + + public void updateGukYuinMastRegRemove(String chnDtctId) { + gukYuinRepository.updateGukYuinMastRegRemove(chnDtctId); + } + + public void updateInferenceGeomDataPnuCnt(String chnDtctObjtId, long pnuCnt) { + gukYuinRepository.updateInferenceGeomDataPnuCnt(chnDtctObjtId, pnuCnt); + } + + public Long findMapSheetAnalDataInferenceGeomUid(String chnDtctObjtId) { + return gukYuinRepository.findMapSheetAnalDataInferenceGeomUid(chnDtctObjtId); + } + + public void insertGeoUidPnuData(Long geoUid, String[] pnuList, String chnDtctObjtId) { + gukYuinRepository.insertGeoUidPnuData(geoUid, pnuList, chnDtctObjtId); + } + + public LearnInfo findMapSheetLearnInfo(UUID uuid) { + return gukYuinRepository.findMapSheetLearnInfo(uuid); + } + + public Integer findMapSheetLearnYearStage(Integer compareYyyy, Integer targetYyyy) { + return gukYuinRepository.findMapSheetLearnYearStage(compareYyyy, targetYyyy); + } + + public void updateAnalInferenceApplyDttm(Basic registRes) { + gukYuinRepository.updateAnalInferenceApplyDttm(registRes); + } + + public List findLabelingCompleteSendList(LocalDate yesterday) { + return gukYuinRepository.findLabelingCompleteSendList(yesterday); + } + + public Long findMapSheetLearnInfoByYyyy( + Integer compareYyyy, Integer targetYyyy, Integer maxStage) { + return gukYuinRepository.findMapSheetLearnInfoByYyyy(compareYyyy, targetYyyy, maxStage); + } + + public void updateMapSheetLearnGukyuinEndStatus(Long learnId) { + gukYuinRepository.updateMapSheetLearnGukyuinEndStatus(learnId); + } + + public void updateMapSheetInferenceLabelEndStatus(Long learnId) { + gukYuinRepository.updateMapSheetInferenceLabelEndStatus(learnId); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinJobCoreService.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinJobCoreService.java new file mode 100644 index 0000000..6d5f274 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinJobCoreService.java @@ -0,0 +1,27 @@ +package com.kamco.cd.kamcoback.postgres.core; + +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LearnKeyDto; +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinStatus; +import com.kamco.cd.kamcoback.postgres.repository.gukyuin.GukYuinRepository; +import java.util.List; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class GukYuinJobCoreService { + + private final GukYuinRepository gukYuinRepository; + + public GukYuinJobCoreService(GukYuinRepository gukYuinRepository) { + this.gukYuinRepository = gukYuinRepository; + } + + @Transactional + public void updateGukYuinApplyStateComplete(Long id, GukYuinStatus status) { + gukYuinRepository.updateGukYuinApplyStateComplete(id, status); + } + + public List findGukyuinApplyStatusUidList(List gukYuinStatus) { + return gukYuinRepository.findGukyuinApplyStatusUidList(gukYuinStatus); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.java new file mode 100644 index 0000000..9988dd4 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/core/GukYuinPnuCntUpdateJobCoreService.java @@ -0,0 +1,26 @@ +package com.kamco.cd.kamcoback.postgres.core; + +import com.kamco.cd.kamcoback.postgres.repository.gukyuin.GukYuinPnuCntUpdateJobRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +public class GukYuinPnuCntUpdateJobCoreService { + + private final GukYuinPnuCntUpdateJobRepository gukYuinPnuCntUpdateRepository; + + public GukYuinPnuCntUpdateJobCoreService( + GukYuinPnuCntUpdateJobRepository gukYuinPnuCntUpdateRepository) { + this.gukYuinPnuCntUpdateRepository = gukYuinPnuCntUpdateRepository; + } + + @Transactional + public void updateGukYuinContListPnuUpdateCnt() { + gukYuinPnuCntUpdateRepository.updateGukYuinContListPnuUpdateCnt(); + } + + @Transactional + public void updateGukYuinApplyStatus(String uid, String status) { + gukYuinPnuCntUpdateRepository.updateGukYuinApplyStatus(uid, status); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/CommonDateEntity.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/CommonDateEntity.java new file mode 100644 index 0000000..cb9abe9 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/CommonDateEntity.java @@ -0,0 +1,34 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.PrePersist; +import jakarta.persistence.PreUpdate; +import java.time.ZonedDateTime; +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; + +@Getter +@MappedSuperclass +public class CommonDateEntity { + + @CreatedDate + @Column(name = "created_dttm", updatable = false, nullable = false) + private ZonedDateTime createdDate; + + @LastModifiedDate + @Column(name = "updated_dttm", nullable = false) + private ZonedDateTime modifiedDate; + + @PrePersist + protected void onPersist() { + this.createdDate = ZonedDateTime.now(); + this.modifiedDate = ZonedDateTime.now(); + } + + @PreUpdate + protected void onUpdate() { + this.modifiedDate = ZonedDateTime.now(); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.java new file mode 100644 index 0000000..0e0abea --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingAssignmentEntity.java @@ -0,0 +1,69 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import java.time.ZonedDateTime; +import java.util.UUID; + +@Entity +@Table(name = "tb_labeling_assignment") +public class LabelingAssignmentEntity extends CommonDateEntity { + + @Id + @Column(name = "assignment_uid") + private UUID assignmentUid; + + @Column(name = "inference_geom_uid") + private Long inferenceGeomUid; + + @Column(name = "worker_uid") + private String workerUid; + + @Column(name = "inspector_uid") + private String inspectorUid; + + @Column(name = "work_state") + private String workState; + + @Column(name = "stagnation_yn") + private Character stagnationYn; + + @Column(name = "assign_group_id") + private String assignGroupId; + + @Column(name = "learn_geom_uid") + private Long learnGeomUid; + + @Column(name = "anal_uid") + private Long analUid; + + @Column(name = "inspect_state") + private String inspectState; + + @Column(name = "work_stat_dttm") + private ZonedDateTime workStatDttm; + + @Column(name = "inspect_stat_dttm") + private ZonedDateTime inspectStatDttm; + + public LabelAllocateDto.Basic toDto() { + return new LabelAllocateDto.Basic( + this.assignmentUid, + this.inferenceGeomUid, + this.workerUid, + this.inspectorUid, + this.workState, + this.stagnationYn, + this.assignGroupId, + this.learnGeomUid, + this.analUid, + super.getCreatedDate(), + super.getModifiedDate(), + this.inspectState, + this.workStatDttm, + this.inspectStatDttm); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.java new file mode 100644 index 0000000..c378179 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/LabelingInspectorEntity.java @@ -0,0 +1,32 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import com.kamco.cd.kamcoback.label.dto.LabelInspectorDto; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import java.util.UUID; + +@Entity +@Table(name = "tb_labeling_inspector") +public class LabelingInspectorEntity extends CommonDateEntity { + + @Id + @Column(name = "operator_uid") + private UUID operatorUid; + + @Column(name = "anal_uid") + private Long analUid; + + @Column(name = "inspector_uid") + private String inspectorUid; + + public LabelInspectorDto.Basic toDto() { + return new LabelInspectorDto.Basic( + this.operatorUid, + this.analUid, + this.inspectorUid, + super.getCreatedDate(), + super.getModifiedDate()); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.java new file mode 100644 index 0000000..39b2de4 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx50kEntity.java @@ -0,0 +1,53 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.locationtech.jts.geom.Geometry; + +@Getter +@Setter +@Table(name = "tb_map_inkx_50k") +@Entity +@NoArgsConstructor +public class MapInkx50kEntity extends CommonDateEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tb_map_inkx_50k_fid_seq_gen") + @SequenceGenerator( + name = "tb_map_inkx_50k_fid_seq_gen", + sequenceName = "tb_map_inkx_50k_fid_seq", + allocationSize = 1) + private Integer fid; + + @Column(name = "mapidcd_no") + private String mapidcdNo; + + @Column(name = "mapid_nm") + private String mapidNm; + + @Column(name = "mapid_no") + private String mapidNo; + + @Column(name = "geom") + private Geometry geom; + + public MapInkx50kEntity(String mapidcdNo, String mapidNm, String mapidNo, Geometry geom) { + this.mapidcdNo = mapidcdNo; + this.mapidNm = mapidNm; + this.mapidNo = mapidNo; + this.geom = geom; + } + + public MapSheet toEntity() { + return new MapSheet(mapidcdNo, mapidNm); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.java new file mode 100644 index 0000000..5efc3df --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapInkx5kEntity.java @@ -0,0 +1,86 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import com.kamco.cd.kamcoback.enums.CommonUseStatus; +import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto; +import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.MapSheet; +import com.kamco.cd.kamcoback.scene.dto.MapInkxMngDto.MapListEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.locationtech.jts.geom.Geometry; + +@Getter +@Setter +@Table(name = "tb_map_inkx_5k") +@Entity +@NoArgsConstructor +public class MapInkx5kEntity extends CommonDateEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tb_map_inkx_5k_fid_seq_gen") + @SequenceGenerator( + name = "tb_map_inkx_5k_fid_seq_gen", + sequenceName = "tb_map_inkx_5k_fid_seq", + allocationSize = 1) + private Integer fid; + + @Column(name = "mapidcd_no") + private String mapidcdNo; + + @Column(name = "mapid_nm") + private String mapidNm; + + @Column(name = "geom") + private Geometry geom; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "fid_k50", referencedColumnName = "fid") + private MapInkx50kEntity mapInkx50k; + + // 사용상태 USE, + @Column(name = "use_inference") + @Enumerated(EnumType.STRING) + private CommonUseStatus useInference; + + // Constructor + public MapInkx5kEntity( + String mapidcdNo, String mapidNm, Geometry geom, MapInkx50kEntity mapInkx50k) { + this.mapidcdNo = mapidcdNo; + this.mapidNm = mapidNm; + this.geom = geom; + this.mapInkx50k = mapInkx50k; + // 생성시 default 사용함 (사용,제외,사용안함) + this.useInference = CommonUseStatus.USE; + } + + // 변경 사용상태 (추론사용여부) + public void updateUseInference(CommonUseStatus useInference) { + this.useInference = useInference; + } + + public InferenceDetailDto.MapSheet toEntity() { + return new MapSheet(mapidcdNo, mapidNm); + } + + public MapListEntity toDto() { + return MapListEntity.builder() + .scene5k(this.toEntity()) + .scene50k(this.mapInkx50k.toEntity()) + .useInference(useInference) + .createdDttm(super.getCreatedDate()) + .updatedDttm(super.getModifiedDate()) + .build(); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceEntity.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceEntity.java new file mode 100644 index 0000000..e4d3981 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceEntity.java @@ -0,0 +1,167 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Size; +import java.time.ZonedDateTime; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +@Getter +@Setter +@Entity +@Table(name = "tb_map_sheet_anal_data_inference") +public class MapSheetAnalDataInferenceEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "data_uid", nullable = false) + private Long id; + + // @Size(max = 128) + // @Column(name = "data_name", length = 128) + // private String dataName; + // + // @Size(max = 255) + // @Column(name = "data_path") + // private String dataPath; + // + // @Size(max = 128) + // @Column(name = "data_type", length = 128) + // private String dataType; + // + // @Size(max = 128) + // @Column(name = "data_crs_type", length = 128) + // private String dataCrsType; + // + // @Size(max = 255) + // @Column(name = "data_crs_type_name") + // private String dataCrsTypeName; + + @ColumnDefault("now()") + @Column(name = "created_dttm") + private ZonedDateTime createdDttm; + + @Column(name = "created_uid") + private Long createdUid; + + @ColumnDefault("now()") + @Column(name = "updated_dttm") + private ZonedDateTime updatedDttm; + + @Column(name = "updated_uid") + private Long updatedUid; + + @Column(name = "compare_yyyy") + private Integer compareYyyy; + + @Column(name = "target_yyyy") + private Integer targetYyyy; + + // @Column(name = "data_json", length = Integer.MAX_VALUE) + // private String dataJson; + // + // @Size(max = 20) + // @ColumnDefault("'0'") + // @Column(name = "data_state", length = 20) + // private String dataState; + + // @ColumnDefault("now()") + // @Column(name = "data_state_dttm") + // private ZonedDateTime dataStateDttm; + // + // @Column(name = "anal_strt_dttm") + // private ZonedDateTime analStrtDttm; + // + // @Column(name = "anal_end_dttm") + // private ZonedDateTime analEndDttm; + // + // @ColumnDefault("0") + // @Column(name = "anal_sec") + // private Long analSec; + + @Size(max = 20) + @Column(name = "anal_state", length = 20) + private String analState; + + @Column(name = "anal_uid") + private Long analUid; + + @Column(name = "map_sheet_num") + private Long mapSheetNum; + + // @ColumnDefault("0") + // @Column(name = "detecting_cnt") + // private Long detectingCnt; + + // @ColumnDefault("0") + // @Column(name = "pnu") + // private Long pnu; + + // @Size(max = 20) + // @Column(name = "down_state", length = 20) + // private String downState; + // + // @Column(name = "down_state_dttm") + // private ZonedDateTime downStateDttm; + + @Size(max = 20) + @Column(name = "fit_state", length = 20) + private String fitState; + + @Column(name = "fit_state_dttm") + private ZonedDateTime fitStateDttm; + + @Column(name = "labeler_uid") + private Long labelerUid; + + @Size(max = 20) + @ColumnDefault("NULL") + @Column(name = "label_state", length = 20) + private String labelState; + + @Column(name = "label_state_dttm") + private ZonedDateTime labelStateDttm; + + @Column(name = "tester_uid") + private Long testerUid; + + @Size(max = 20) + @Column(name = "test_state", length = 20) + private String testState; + + @Column(name = "test_state_dttm") + private ZonedDateTime testStateDttm; + + @Column(name = "fit_state_cmmnt", length = Integer.MAX_VALUE) + private String fitStateCmmnt; + + @Column(name = "ref_map_sheet_num") + private Long refMapSheetNum; + + @Column(name = "stage") + private Integer stage; + + @Column(name = "file_created_yn") + private Boolean fileCreatedYn; + + @Column(name = "file_created_dttm") + private ZonedDateTime fileCreatedDttm; + // @Size(max = 100) + // @Column(name = "m1", length = 100) + // private String m1; + // + // @Size(max = 100) + // @Column(name = "m2", length = 100) + // private String m2; + // + // @Size(max = 100) + // @Column(name = "m3", length = 100) + // private String m3; + +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.java new file mode 100644 index 0000000..c0487a1 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.java @@ -0,0 +1,181 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import com.kamco.cd.kamcoback.inference.dto.DetectionClassification; +import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto; +import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto.Clazzes; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Size; +import java.time.ZonedDateTime; +import java.util.UUID; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; +import org.locationtech.jts.geom.Geometry; + +@Getter +@Setter +@Entity +@Table(name = "tb_map_sheet_anal_data_inference_geom") +public class MapSheetAnalDataInferenceGeomEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "geo_uid") + private Long geoUid; + + @Column(name = "cd_prob") + private Double cdProb; + + @Size(max = 40) + @Column(name = "class_before_cd", length = 40) + private String classBeforeCd; + + @Column(name = "class_before_prob") + private Double classBeforeProb; + + @Size(max = 40) + @Column(name = "class_after_cd", length = 40) + private String classAfterCd; + + @Column(name = "class_after_prob") + private Double classAfterProb; + + @Column(name = "map_sheet_num") + private Long mapSheetNum; + + @Column(name = "compare_yyyy") + private Integer compareYyyy; + + @Column(name = "target_yyyy") + private Integer targetYyyy; + + @Column(name = "area") + private Double area; + + @Size(max = 100) + @Column(name = "geo_type", length = 100) + private String geoType; + + @Column(name = "data_uid") + private Long dataUid; + + @ColumnDefault("now()") + @Column(name = "created_dttm") + private ZonedDateTime createdDttm; + + @Column(name = "created_uid") + private Long createdUid; + + @ColumnDefault("now()") + @Column(name = "updated_dttm") + private ZonedDateTime updatedDttm; + + @Column(name = "updated_uid") + private Long updatedUid; + + @ColumnDefault("0") + @Column(name = "geom_cnt") + private Long geomCnt; + + @ColumnDefault("0") + @Column(name = "pnu") + private Long pnu; + + @Size(max = 20) + @Column(name = "fit_state", length = 20) + private String fitState; + + @ColumnDefault("now()") + @Column(name = "fit_state_dttm") + private ZonedDateTime fitStateDttm; + + @Column(name = "labeler_uid") + private Long labelerUid; + + @Size(max = 20) + @ColumnDefault("'0'") + @Column(name = "label_state", length = 20) + private String labelState; + + @ColumnDefault("now()") + @Column(name = "label_state_dttm") + private ZonedDateTime labelStateDttm; + + @Column(name = "tester_uid") + private Long testerUid; + + @Size(max = 20) + @ColumnDefault("'0'") + @Column(name = "test_state", length = 20) + private String testState; + + @ColumnDefault("now()") + @Column(name = "test_state_dttm") + private ZonedDateTime testStateDttm; + + @Column(name = "fit_state_cmmnt", length = Integer.MAX_VALUE) + private String fitStateCmmnt; + + @Column(name = "ref_map_sheet_num") + private Long refMapSheetNum; + + @ColumnDefault("uuid_generate_v4()") + @Column(name = "uuid") + private UUID uuid; + + @Column(name = "stage") + private Integer stage; + + @Column(name = "file_created_yn") + private Boolean fileCreatedYn; + + @Column(name = "geom", columnDefinition = "geometry") + private Geometry geom; + + @Column(name = "geom_center", columnDefinition = "geometry") + private Geometry geomCenter; + + @Column(name = "before_geom", columnDefinition = "geometry") + private Geometry beforeGeom; + + @Column(name = "file_created_dttm") + private ZonedDateTime fileCreatedDttm; + + @Column(name = "result_uid") + private String resultUid; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "map_5k_id", referencedColumnName = "fid") + private MapInkx5kEntity map5k; + + @Column(name = "label_send_dttm") + private ZonedDateTime labelSendDttm; + + @Column(name = "lock_yn") + private String lockYn; + + public InferenceDetailDto.DetailListEntity toEntity() { + DetectionClassification classification = DetectionClassification.fromString(classBeforeCd); + Clazzes comparedClazz = new Clazzes(classification, classBeforeProb); + DetectionClassification classification1 = DetectionClassification.fromString(classAfterCd); + Clazzes targetClazz = new Clazzes(classification1, classAfterProb); + InferenceDetailDto.MapSheet mapSheet = map5k != null ? map5k.toEntity() : null; + + InferenceDetailDto.Coordinate coordinate = null; + if (geomCenter != null) { + org.locationtech.jts.geom.Point point = (org.locationtech.jts.geom.Point) geomCenter; + coordinate = new InferenceDetailDto.Coordinate(point.getX(), point.getY()); + } + + return new InferenceDetailDto.DetailListEntity( + uuid, cdProb, comparedClazz, targetClazz, mapSheet, coordinate, createdDttm); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalInferenceEntity.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalInferenceEntity.java new file mode 100644 index 0000000..cfbbf42 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalInferenceEntity.java @@ -0,0 +1,165 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Size; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +@Getter +@Setter +@Entity +@Table(name = "tb_map_sheet_anal_inference") +public class MapSheetAnalInferenceEntity { + + @Id + @GeneratedValue( + strategy = GenerationType.SEQUENCE, + generator = "tb_map_sheet_anal_inference_id_gen") + @SequenceGenerator( + name = "tb_map_sheet_anal_inference_id_gen", + sequenceName = "tb_map_sheet_anal_inference_uid", + allocationSize = 1) + @Column(name = "anal_uid", nullable = false) + private Long id; + + @Column(name = "compare_yyyy") + private Integer compareYyyy; + + @Column(name = "target_yyyy") + private Integer targetYyyy; + + @Column(name = "model_uid") + private Long modelUid; + + @Size(max = 100) + @Column(name = "server_ids", length = 100) + private String serverIds; + + @Column(name = "anal_strt_dttm") + private ZonedDateTime analStrtDttm; + + @Column(name = "anal_end_dttm") + private ZonedDateTime analEndDttm; + + @Column(name = "anal_sec") + private Long analSec; + + @Size(max = 20) + @Column(name = "anal_state", length = 20) + private String analState; + + @Size(max = 20) + @Column(name = "gukyuin_used", length = 20) + private String gukyuinUsed; + + @Column(name = "accuracy") + private Double accuracy; + + @Size(max = 255) + @Column(name = "result_url") + private String resultUrl; + + @ColumnDefault("now()") + @Column(name = "created_dttm") + private ZonedDateTime createdDttm; + + @Column(name = "created_uid") + private Long createdUid; + + @ColumnDefault("now()") + @Column(name = "updated_dttm") + private ZonedDateTime updatedDttm; + + @Column(name = "updated_uid") + private Long updatedUid; + + @Size(max = 255) + @Column(name = "anal_title") + private String analTitle; + + @Column(name = "detecting_cnt") + private Long detectingCnt; + + @Column(name = "anal_pred_sec") + private Long analPredSec; + + @Column(name = "model_ver_uid") + private Long modelVerUid; + + @Column(name = "hyper_params") + @JdbcTypeCode(SqlTypes.JSON) + private Map hyperParams; + + @Column(name = "tranning_rate") + private List tranningRate; + + @Column(name = "validation_rate") + private List validationRate; + + @Column(name = "test_rate", length = Integer.MAX_VALUE) + private String testRate; + + @Size(max = 128) + @Column(name = "detecting_description", length = 128) + private String detectingDescription; + + @Size(max = 12) + @Column(name = "base_map_sheet_num", length = 12) + private String baseMapSheetNum; + + @ColumnDefault("gen_random_uuid()") + @Column(name = "uuid") + private UUID uuid; + + @Size(max = 50) + @Column(name = "model_m1_ver", length = 50) + private String modelM1Ver; + + @Size(max = 50) + @Column(name = "model_m2_ver", length = 50) + private String modelM2Ver; + + @Size(max = 50) + @Column(name = "model_m3_ver", length = 50) + private String modelM3Ver; + + @Size(max = 20) + @Column(name = "anal_target_type", length = 20) + private String analTargetType; + + @Column(name = "gukyuin_apply_dttm") + private ZonedDateTime gukyuinApplyDttm; + + @Size(max = 20) + @Column(name = "detection_data_option", length = 20) + private String detectionDataOption; + + @Column(name = "stage") + private Integer stage; + + @Size(max = 1) + @ColumnDefault("'N'") + @Column(name = "labeling_closed_yn", length = 1) + private String labelingClosedYn = "N"; + + @Size(max = 1) + @ColumnDefault("'N'") + @Column(name = "inspection_closed_yn", length = 1) + private String inspectionClosedYn = "N"; + + @Column(name = "learn_id") + private Long learnId; +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnDataGeomEntity.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnDataGeomEntity.java new file mode 100644 index 0000000..d560d54 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnDataGeomEntity.java @@ -0,0 +1,45 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; +import org.locationtech.jts.geom.Geometry; + +/** 라벨링 툴에서 그린 폴리곤 저장 테이블 */ +@Getter +@Setter +@Entity +@Table(name = "tb_map_sheet_learn_data_geom") +public class MapSheetLearnDataGeomEntity extends CommonDateEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "geo_uid", nullable = false) + private Long geoUid; + + @Column(name = "after_yyyy") + private Integer afterYyyy; + + @Column(name = "area") + private Double area; + + @Column(name = "before_yyyy") + private Integer beforeYyyy; + + @Column(name = "class_after_cd") + private String classAfterCd; + + @Column(name = "class_before_cd") + private String classBeforeCd; + + @Column(name = "geom") + private Geometry geom; + + @Column(name = "file_create_yn") + private Boolean fileCreateYn; +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnEntity.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnEntity.java new file mode 100644 index 0000000..a161c05 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetLearnEntity.java @@ -0,0 +1,221 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinStatus; +import com.kamco.cd.kamcoback.inference.dto.InferenceResultDto; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import java.time.ZonedDateTime; +import java.util.UUID; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +@Getter +@Setter +@Entity +@Table(name = "tb_map_sheet_learn") +public class MapSheetLearnEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tb_map_sheet_learn_id_gen") + @SequenceGenerator( + name = "tb_map_sheet_learn_id_gen", + sequenceName = "tb_map_sheet_learn_uid", + allocationSize = 1) + @Column(name = "id", nullable = false) + private Long id; + + @ColumnDefault("gen_random_uuid()") + @Column(name = "uuid") + private UUID uuid = UUID.randomUUID(); + + @Size(max = 200) + @NotNull + @Column(name = "title", nullable = false, length = 200) + private String title; + + @Size(max = 20) + @Column(name = "status", length = 10) + private String status; + + @Column(name = "m1_model_uuid") + private UUID m1ModelUuid; + + @Column(name = "m2_model_uuid") + private UUID m2ModelUuid; + + @Column(name = "m3_model_uuid") + private UUID m3ModelUuid; + + @Column(name = "compare_yyyy") + private Integer compareYyyy; + + @Column(name = "target_yyyy") + private Integer targetYyyy; + + @Size(max = 20) + @Column(name = "detect_option", length = 20) + private String detectOption; + + @Size(max = 100) + @Column(name = "map_sheet_cnt", length = 100) + private String mapSheetCnt; + + @Size(max = 20) + @Column(name = "map_sheet_scope", length = 20) + private String mapSheetScope; + + @Column(name = "detecting_cnt") + private Long detectingCnt; + + @Column(name = "infer_start_dttm") + private ZonedDateTime inferStartDttm; + + @Column(name = "infer_end_dttm") + private ZonedDateTime inferEndDttm; + + @Column(name = "elapsed_time") + private ZonedDateTime elapsedTime; + + @Column(name = "apply_yn") + private Boolean applyYn; + + @Column(name = "apply_dttm") + private ZonedDateTime applyDttm; + + @org.hibernate.annotations.CreationTimestamp + @Column(name = "created_dttm") + private ZonedDateTime createdDttm; + + @Column(name = "created_uid") + private Long createdUid; + + @ColumnDefault("now()") + @Column(name = "updated_dttm") + private ZonedDateTime updatedDttm; + + @Column(name = "updated_uid") + private Long updatedUid; + + @Column(name = "running_model_type") + private String runningModelType; + + @Column(name = "detect_end_cnt") + private Long detectEndCnt; + + @Column(name = "model_compare_path") + private String modelComparePath; + + @Column(name = "model_target_path") + private String modelTargetPath; + + @Column(name = "stage") + private Integer stage; + + /* ===================== M1 ===================== */ + + @Column(name = "m1_model_batch_id") + private Long m1ModelBatchId; + + @Column(name = "m1_model_start_dttm") + private ZonedDateTime m1ModelStartDttm; + + @Column(name = "m1_model_end_dttm") + private ZonedDateTime m1ModelEndDttm; + + @Column(name = "m1_pending_jobs", nullable = false) + private int m1PendingJobs = 0; + + @Column(name = "m1_running_jobs", nullable = false) + private int m1RunningJobs = 0; + + @Column(name = "m1_completed_jobs", nullable = false) + private int m1CompletedJobs = 0; + + @Column(name = "m1_failed_jobs", nullable = false) + private int m1FailedJobs = 0; + + /* ===================== M2 ===================== */ + + @Column(name = "m2_model_batch_id") + private Long m2ModelBatchId; + + @Column(name = "m2_model_start_dttm") + private ZonedDateTime m2ModelStartDttm; + + @Column(name = "m2_model_end_dttm") + private ZonedDateTime m2ModelEndDttm; + + @Column(name = "m2_pending_jobs", nullable = false) + private int m2PendingJobs = 0; + + @Column(name = "m2_running_jobs", nullable = false) + private int m2RunningJobs = 0; + + @Column(name = "m2_completed_jobs", nullable = false) + private int m2CompletedJobs = 0; + + @Column(name = "m2_failed_jobs", nullable = false) + private int m2FailedJobs = 0; + + /* ===================== M3 ===================== */ + @Column(name = "m3_model_batch_id") + private Long m3ModelBatchId; + + @Column(name = "m3_model_start_dttm") + private ZonedDateTime m3ModelStartDttm; + + @Column(name = "m3_model_end_dttm") + private ZonedDateTime m3ModelEndDttm; + + @Column(name = "m3_pending_jobs", nullable = false) + private int m3PendingJobs = 0; + + @Column(name = "m3_running_jobs", nullable = false) + private int m3RunningJobs = 0; + + @Column(name = "m3_completed_jobs", nullable = false) + private int m3CompletedJobs = 0; + + @Column(name = "m3_failed_jobs", nullable = false) + private int m3FailedJobs = 0; + + @Column(name = "apply_status") + private String applyStatus = GukYuinStatus.PENDING.getId(); + + @Column(name = "apply_status_dttm") + private ZonedDateTime applyStatusDttm; + + @Column(name = "uid", nullable = false) + private String uid = UUID.randomUUID().toString().replace("-", "").toUpperCase(); + + @Column(name = "total_jobs") + private Long totalJobs; + + @Column(name = "chn_dtct_mst_id") + private String chnDtctMstId; + + public InferenceResultDto.ResultList toDto() { + return new InferenceResultDto.ResultList( + this.uuid, + this.title, + this.stage, + this.status, + this.mapSheetCnt, + this.detectingCnt, + this.inferStartDttm, + this.inferEndDttm, + this.applyYn, + this.applyDttm, + this.compareYyyy, + this.targetYyyy, + this.uid); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.java new file mode 100644 index 0000000..26f9c8e --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/entity/PnuEntity.java @@ -0,0 +1,186 @@ +package com.kamco.cd.kamcoback.postgres.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import java.time.ZonedDateTime; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; + +@Getter +@Setter +@Entity +@Table(name = "tb_pnu") +public class PnuEntity { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tb_pnu_id_gen") + @SequenceGenerator(name = "tb_pnu_id_gen", sequenceName = "tb_pnu_uid", allocationSize = 1) + @Column(name = "id", nullable = false) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "geo_uid", nullable = false) + private MapSheetAnalDataInferenceGeomEntity geo; + + @Size(max = 19) + @Column(name = "pnu", length = 19) + private String pnu; + + @Column(name = "created_dttm") + private ZonedDateTime createdDttm; + + @Column(name = "created_uid") + private Long createdUid; + + @ColumnDefault("false") + @Column(name = "del_yn") + private Boolean delYn; + + @Size(max = 40) + @Column(name = "pnu_dtct_id", length = 40) + private String pnuDtctId; + + @Size(max = 10) + @Column(name = "lrm_sync_ymd", length = 10) + private String lrmSyncYmd; + + @Size(max = 10) + @Column(name = "pnu_sync_ymd", length = 10) + private String pnuSyncYmd; + + @Size(max = 20) + @Column(name = "mpqd_no", length = 20) + private String mpqdNo; + + @Size(max = 10) + @Column(name = "cprs_yr", length = 10) + private String cprsYr; + + @Size(max = 10) + @Column(name = "crtr_yr", length = 10) + private String crtrYr; + + @Size(max = 255) + @Column(name = "chn_dtct_id") + private String chnDtctId; + + @Size(max = 10) + @Column(name = "chn_dtct_mst_id", length = 10) + private String chnDtctMstId; + + @Size(max = 255) + @Column(name = "chn_dtct_objt_id") + private String chnDtctObjtId; + + @Size(max = 255) + @Column(name = "chn_dtct_cont_id") + private String chnDtctContId; + + @Size(max = 50) + @Column(name = "chn_cd", length = 50) + private String chnCd; + + @Size(max = 50) + @Column(name = "chn_dtct_prob", length = 50) + private String chnDtctProb; + + @Size(max = 50) + @Column(name = "bf_cls_cd", length = 50) + private String bfClsCd; + + @Size(max = 50) + @Column(name = "bf_cls_prob", length = 50) + private String bfClsProb; + + @Size(max = 50) + @Column(name = "af_cls_cd", length = 50) + private String afClsCd; + + @Size(max = 50) + @Column(name = "af_cls_prob", length = 50) + private String afClsProb; + + @Size(max = 100) + @Column(name = "pnu_sqms", length = 100) + private String pnuSqms; + + @Size(max = 100) + @Column(name = "pnu_dtct_sqms", length = 100) + private String pnuDtctSqms; + + @Size(max = 100) + @Column(name = "chn_dtct_sqms", length = 100) + private String chnDtctSqms; + + @Size(max = 1) + @Column(name = "stblt_yn", length = 1) + private String stbltYn; + + @Size(max = 30) + @Column(name = "incy_cd", length = 30) + private String incyCd; + + @Size(max = 255) + @Column(name = "incy_rsn_cont") + private String incyRsnCont; + + @Size(max = 1) + @Column(name = "lock_yn", length = 1) + private String lockYn; + + @Size(max = 1) + @Column(name = "lbl_yn", length = 1) + private String lblYn; + + @Size(max = 1) + @Column(name = "chg_yn", length = 1) + private String chgYn; + + @Size(max = 50) + @Column(name = "rsatct_no", length = 50) + private String rsatctNo; + + @Size(max = 100) + @Column(name = "rmk", length = 100) + private String rmk; + + @Size(max = 20) + @Column(name = "crt_dt", length = 20) + private String crtDt; + + @Size(max = 20) + @Column(name = "crt_epno", length = 20) + private String crtEpno; + + @Size(max = 20) + @Column(name = "crt_ip", length = 20) + private String crtIp; + + @Size(max = 20) + @Column(name = "chg_dt", length = 20) + private String chgDt; + + @Size(max = 20) + @Column(name = "chg_epno", length = 20) + private String chgEpno; + + @Size(max = 20) + @Column(name = "chg_ip", length = 20) + private String chgIp; + + @Size(max = 10) + @Column(name = "chn_dtct_sno", length = 10) + private String chnDtctSno; +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepository.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepository.java new file mode 100644 index 0000000..ad09396 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepository.java @@ -0,0 +1,7 @@ +package com.kamco.cd.kamcoback.postgres.repository.gukyuin; + +import com.kamco.cd.kamcoback.postgres.entity.MapSheetLearnEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GukYuinPnuCntUpdateJobRepository + extends JpaRepository, GukYuinPnuCntUpdateJobRepositoryCustom {} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.java new file mode 100644 index 0000000..b4e7e1d --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryCustom.java @@ -0,0 +1,8 @@ +package com.kamco.cd.kamcoback.postgres.repository.gukyuin; + +public interface GukYuinPnuCntUpdateJobRepositoryCustom { + + void updateGukYuinContListPnuUpdateCnt(); + + void updateGukYuinApplyStatus(String uid, String status); +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.java new file mode 100644 index 0000000..b54a059 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinPnuCntUpdateJobRepositoryImpl.java @@ -0,0 +1,48 @@ +package com.kamco.cd.kamcoback.postgres.repository.gukyuin; + +import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetLearnEntity.mapSheetLearnEntity; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import java.time.ZonedDateTime; +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class GukYuinPnuCntUpdateJobRepositoryImpl + implements GukYuinPnuCntUpdateJobRepositoryCustom { + + private final JPAQueryFactory queryFactory; + private final JdbcTemplate jdbcTemplate; + @PersistenceContext private EntityManager em; + + @Override + public void updateGukYuinContListPnuUpdateCnt() { + String sql = + """ + update tb_map_sheet_anal_data_inference_geom p + set pnu = c_count.actual_count + from ( + select geo_uid, count(*) actual_count + from tb_pnu + group by geo_uid + ) c_count + where p.geo_uid = c_count.geo_uid and p.pnu != c_count.actual_count; + """; + + jdbcTemplate.update(sql); + } + + @Override + public void updateGukYuinApplyStatus(String uid, String status) { + queryFactory + .update(mapSheetLearnEntity) + .set(mapSheetLearnEntity.applyStatus, status) + .set(mapSheetLearnEntity.applyStatusDttm, ZonedDateTime.now()) + .where(mapSheetLearnEntity.uid.eq(uid)) + .execute(); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepository.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepository.java new file mode 100644 index 0000000..83a1e07 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepository.java @@ -0,0 +1,7 @@ +package com.kamco.cd.kamcoback.postgres.repository.gukyuin; + +import com.kamco.cd.kamcoback.postgres.entity.MapSheetLearnEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GukYuinRepository + extends JpaRepository, GukYuinRepositoryCustom {} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryCustom.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryCustom.java new file mode 100644 index 0000000..84d92ff --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryCustom.java @@ -0,0 +1,48 @@ +package com.kamco.cd.kamcoback.postgres.repository.gukyuin; + +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.Basic; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LabelSendDto; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LearnKeyDto; +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.GeomUidDto; +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.LearnInfo; +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinStatus; +import java.time.LocalDate; +import java.util.List; +import java.util.UUID; + +public interface GukYuinRepositoryCustom { + + void updateGukYuinMastRegResult(Basic resultBody); + + void updateGukYuinMastRegRemove(String chnDtctId); + + void updateInferenceGeomDataPnuCnt(String chnDtctObjtId, long pnuCnt); + + Long findMapSheetAnalDataInferenceGeomUid(String chnDtctObjtId); + + void insertGeoUidPnuData(Long geoUid, String[] pnuList, String chnDtctObjtId); + + void updateGukYuinApplyStateComplete(Long id, GukYuinStatus status); + + List findGukyuinApplyStatusUidList(List gukYuinStatus); + + long upsertMapSheetDataAnalGeomPnu(String uid, String[] pnuList); + + LearnInfo findMapSheetLearnInfo(UUID uuid); + + Integer findMapSheetLearnYearStage(Integer compareYyyy, Integer targetYyyy); + + void updateAnalInferenceApplyDttm(Basic registRes); + + List findYesterdayLabelingCompleteList(); + + void updateAnalDataInferenceGeomSendDttm(Long geoUid); + + List findLabelingCompleteSendList(LocalDate yesterday); + + Long findMapSheetLearnInfoByYyyy(Integer compareYyyy, Integer targetYyyy, Integer maxStage); + + void updateMapSheetLearnGukyuinEndStatus(Long learnId); + + void updateMapSheetInferenceLabelEndStatus(Long learnId); +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryImpl.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryImpl.java new file mode 100644 index 0000000..d274d85 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/postgres/repository/gukyuin/GukYuinRepositoryImpl.java @@ -0,0 +1,331 @@ +package com.kamco.cd.kamcoback.postgres.repository.gukyuin; + +import static com.kamco.cd.kamcoback.postgres.entity.QLabelingAssignmentEntity.labelingAssignmentEntity; +import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalDataInferenceGeomEntity.mapSheetAnalDataInferenceGeomEntity; +import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetAnalInferenceEntity.mapSheetAnalInferenceEntity; +import static com.kamco.cd.kamcoback.postgres.entity.QMapSheetLearnEntity.mapSheetLearnEntity; +import static com.kamco.cd.kamcoback.postgres.entity.QPnuEntity.pnuEntity; + +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.Basic; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LabelSendDto; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LearnKeyDto; +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.GeomUidDto; +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.LearnInfo; +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinStatus; +import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.InspectState; +import com.kamco.cd.kamcoback.label.dto.LabelAllocateDto.LabelMngState; +import com.kamco.cd.kamcoback.postgres.entity.PnuEntity; +import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.core.types.dsl.NumberExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import jakarta.transaction.Transactional; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class GukYuinRepositoryImpl implements GukYuinRepositoryCustom { + + private final JPAQueryFactory queryFactory; + @PersistenceContext private EntityManager em; + + @Override + public void updateGukYuinMastRegResult(Basic resultBody) { + + int excnPgrt = Integer.parseInt(resultBody.getExcnPgrt()); + int stage = Integer.parseInt(resultBody.getChnDtctSno()); + GukYuinStatus status = GukYuinStatus.IN_PROGRESS; + if (excnPgrt == 100) { + status = GukYuinStatus.GUK_COMPLETED; + } + + queryFactory + .update(mapSheetLearnEntity) + .set(mapSheetLearnEntity.stage, stage) + .set(mapSheetLearnEntity.applyStatus, status.getId()) + .set(mapSheetLearnEntity.applyStatusDttm, ZonedDateTime.now()) + .set(mapSheetLearnEntity.chnDtctMstId, resultBody.getChnDtctMstId()) + .set(mapSheetLearnEntity.applyYn, true) + .set(mapSheetLearnEntity.applyDttm, ZonedDateTime.now()) + .where(mapSheetLearnEntity.uid.eq(resultBody.getChnDtctId())) + .execute(); + } + + @Override + public void updateGukYuinMastRegRemove(String chnDtctId) { + queryFactory + .update(mapSheetLearnEntity) + .set(mapSheetLearnEntity.applyStatus, GukYuinStatus.CANCELED.getId()) + .set(mapSheetLearnEntity.applyStatusDttm, ZonedDateTime.now()) + .set(mapSheetLearnEntity.applyYn, false) + .where(mapSheetLearnEntity.uid.eq(chnDtctId)) + .execute(); + } + + @Override + public void updateInferenceGeomDataPnuCnt(String chnDtctObjtId, long pnuCnt) { + queryFactory + .update(mapSheetAnalDataInferenceGeomEntity) + .set(mapSheetAnalDataInferenceGeomEntity.pnu, pnuCnt) + .where(mapSheetAnalDataInferenceGeomEntity.resultUid.eq(chnDtctObjtId)) + .execute(); + } + + @Override + public Long findMapSheetAnalDataInferenceGeomUid(String chnDtctObjtId) { + return queryFactory + .select(mapSheetAnalDataInferenceGeomEntity.geoUid) + .from(mapSheetAnalDataInferenceGeomEntity) + .where(mapSheetAnalDataInferenceGeomEntity.resultUid.eq(chnDtctObjtId)) + .fetchOne(); + } + + @Override + public void insertGeoUidPnuData(Long geoUid, String[] pnuList, String chnDtctObjtId) { + for (String pnu : pnuList) { + PnuEntity entity = + queryFactory + .selectFrom(pnuEntity) + .where( + pnuEntity.geo.geoUid.eq(geoUid), + pnuEntity.pnu.eq(pnu), + pnuEntity.chnDtctObjtId.eq(chnDtctObjtId)) + .fetchOne(); + + if (entity == null) { + queryFactory + .insert(pnuEntity) + .columns( + pnuEntity.geo.geoUid, pnuEntity.pnu, pnuEntity.createdDttm, pnuEntity.chnDtctObjtId) + .values(geoUid, pnu, ZonedDateTime.now(), chnDtctObjtId) + .execute(); + } + } + } + + @Override + public List findGukyuinApplyStatusUidList(List status) { + return queryFactory + .select( + Projections.constructor( + LearnKeyDto.class, + mapSheetLearnEntity.id, + mapSheetLearnEntity.uid, + mapSheetLearnEntity.chnDtctMstId)) + .from(mapSheetLearnEntity) + .where(mapSheetLearnEntity.applyStatus.in(status)) + .fetch(); + } + + @Override + public long upsertMapSheetDataAnalGeomPnu(String chnDtctObjtId, String[] pnuList) { + long length = pnuList.length; + queryFactory + .update(mapSheetAnalDataInferenceGeomEntity) + .set(mapSheetAnalDataInferenceGeomEntity.pnu, length) + .where(mapSheetAnalDataInferenceGeomEntity.resultUid.eq(chnDtctObjtId)) + .execute(); + + Long geoUid = + queryFactory + .select(mapSheetAnalDataInferenceGeomEntity.geoUid) + .from(mapSheetAnalDataInferenceGeomEntity) + .where(mapSheetAnalDataInferenceGeomEntity.resultUid.eq(chnDtctObjtId)) + .fetchOne(); + + long succCnt = 0; + for (String pnu : pnuList) { + long result = + queryFactory + .insert(pnuEntity) + .columns(pnuEntity.geo.geoUid, pnuEntity.pnu, pnuEntity.createdDttm) + .values(geoUid, pnu, ZonedDateTime.now()) + .execute(); + if (result > 0) { + succCnt++; + } + } + return succCnt; + } + + @Override + public LearnInfo findMapSheetLearnInfo(UUID uuid) { + return queryFactory + .select( + Projections.constructor( + LearnInfo.class, + mapSheetLearnEntity.id, + mapSheetLearnEntity.uuid, + mapSheetLearnEntity.compareYyyy, + mapSheetLearnEntity.targetYyyy, + mapSheetLearnEntity.stage, + mapSheetLearnEntity.uid, + mapSheetLearnEntity.applyStatus, + mapSheetLearnEntity.applyYn)) + .from(mapSheetLearnEntity) + .where(mapSheetLearnEntity.uuid.eq(uuid)) + .fetchOne(); + } + + @Override + public Integer findMapSheetLearnYearStage(Integer compareYyyy, Integer targetYyyy) { + NumberExpression stageExpr = + Expressions.numberTemplate(Integer.class, "coalesce({0}, 0)", mapSheetLearnEntity.stage); + + return queryFactory + .select(stageExpr.max().coalesce(0)) + .from(mapSheetLearnEntity) + .where( + mapSheetLearnEntity.compareYyyy.eq(compareYyyy), + mapSheetLearnEntity.targetYyyy.eq(targetYyyy), + mapSheetLearnEntity.applyStatus.isNotNull(), + mapSheetLearnEntity.applyStatus.ne(GukYuinStatus.PENDING.getId())) + .fetchOne(); + } + + @Override + public void updateAnalInferenceApplyDttm(Basic registRes) { + Long learnId = + queryFactory + .select(mapSheetLearnEntity.id) + .from(mapSheetLearnEntity) + .where(mapSheetLearnEntity.uid.eq(registRes.getChnDtctId())) + .fetchOne(); + + queryFactory + .update(mapSheetAnalInferenceEntity) + .set(mapSheetAnalInferenceEntity.gukyuinUsed, "Y") + .set(mapSheetAnalInferenceEntity.gukyuinApplyDttm, ZonedDateTime.now()) + .set(mapSheetAnalInferenceEntity.stage, Integer.parseInt(registRes.getChnDtctSno())) + .where(mapSheetAnalInferenceEntity.learnId.eq(learnId)) + .execute(); + } + + @Override + public List findYesterdayLabelingCompleteList() { + ZoneId zone = ZoneId.of("Asia/Seoul"); + ZonedDateTime todayStart = ZonedDateTime.now(zone).toLocalDate().atStartOfDay(zone); + ZonedDateTime yesterdayStart = todayStart.minusDays(1); + + BooleanExpression isYesterday = + labelingAssignmentEntity + .inspectStatDttm + .goe(yesterdayStart) + .and(labelingAssignmentEntity.inspectStatDttm.lt(todayStart)); + + return queryFactory + .select( + Projections.constructor( + GeomUidDto.class, + labelingAssignmentEntity.inferenceGeomUid, + mapSheetAnalDataInferenceGeomEntity.resultUid)) + .from(labelingAssignmentEntity) + .innerJoin(mapSheetAnalDataInferenceGeomEntity) + .on( + labelingAssignmentEntity.inferenceGeomUid.eq( + mapSheetAnalDataInferenceGeomEntity.geoUid)) + .innerJoin(mapSheetAnalInferenceEntity) + .on(labelingAssignmentEntity.analUid.eq(mapSheetAnalInferenceEntity.id)) + .innerJoin(mapSheetLearnEntity) + .on( + mapSheetAnalInferenceEntity.learnId.eq(mapSheetLearnEntity.id), + mapSheetLearnEntity.applyStatus.in( + GukYuinStatus.GUK_COMPLETED.getId(), GukYuinStatus.PNU_COMPLETED.getId())) + .where(labelingAssignmentEntity.inspectState.eq(InspectState.COMPLETE.getId()), isYesterday) + .fetch(); + } + + @Override + public void updateAnalDataInferenceGeomSendDttm(Long geoUid) { + queryFactory + .update(mapSheetAnalDataInferenceGeomEntity) + .set(mapSheetAnalDataInferenceGeomEntity.labelSendDttm, ZonedDateTime.now()) + .where(mapSheetAnalDataInferenceGeomEntity.geoUid.eq(geoUid)) + .execute(); + } + + @Override + public List findLabelingCompleteSendList(LocalDate yesterday) { + + ZoneId zone = ZoneId.of("Asia/Seoul"); + ZonedDateTime from = yesterday.atStartOfDay(zone); + ZonedDateTime to = from.plusDays(1); + + BooleanExpression isYesterday = + labelingAssignmentEntity + .inspectStatDttm + .goe(from) + .and(labelingAssignmentEntity.inspectStatDttm.lt(to)); + + return queryFactory + .select( + Projections.constructor( + LabelSendDto.class, + mapSheetAnalDataInferenceGeomEntity.resultUid, + labelingAssignmentEntity.workerUid, + labelingAssignmentEntity.workStatDttm, + labelingAssignmentEntity.inspectorUid, + labelingAssignmentEntity.inspectStatDttm, + mapSheetAnalDataInferenceGeomEntity.labelSendDttm)) + .from(labelingAssignmentEntity) + .innerJoin(mapSheetAnalDataInferenceGeomEntity) + .on( + labelingAssignmentEntity.inferenceGeomUid.eq( + mapSheetAnalDataInferenceGeomEntity.geoUid)) + .where(labelingAssignmentEntity.inspectState.eq(InspectState.COMPLETE.getId()), isYesterday) + .fetch(); + } + + @Override + public Long findMapSheetLearnInfoByYyyy( + Integer compareYyyy, Integer targetYyyy, Integer maxStage) { + return queryFactory + .select(mapSheetLearnEntity.id) + .from(mapSheetLearnEntity) + .where( + mapSheetLearnEntity.compareYyyy.eq(compareYyyy), + mapSheetLearnEntity.targetYyyy.eq(targetYyyy), + mapSheetLearnEntity.stage.eq(maxStage)) + .fetchOne(); + } + + @Override + public void updateMapSheetLearnGukyuinEndStatus(Long learnId) { + queryFactory + .update(mapSheetLearnEntity) + .set(mapSheetLearnEntity.applyStatus, GukYuinStatus.END.getId()) + .set(mapSheetLearnEntity.applyStatusDttm, ZonedDateTime.now()) + .where(mapSheetLearnEntity.id.eq(learnId)) + .execute(); + } + + @Override + public void updateMapSheetInferenceLabelEndStatus(Long learnId) { + queryFactory + .update(mapSheetAnalInferenceEntity) + .set(mapSheetAnalInferenceEntity.analState, LabelMngState.FINISH.getId()) + .set(mapSheetAnalInferenceEntity.updatedDttm, ZonedDateTime.now()) + .where(mapSheetAnalInferenceEntity.learnId.eq(learnId)) + .execute(); + } + + @Override + @Transactional + public void updateGukYuinApplyStateComplete(Long id, GukYuinStatus status) { + queryFactory + .update(mapSheetLearnEntity) + .set(mapSheetLearnEntity.applyStatus, status.getId()) + .set(mapSheetLearnEntity.applyStatusDttm, ZonedDateTime.now()) + .where(mapSheetLearnEntity.id.eq(id)) + .execute(); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.java new file mode 100644 index 0000000..26b0986 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/scene/dto/MapInkxMngDto.java @@ -0,0 +1,220 @@ +package com.kamco.cd.kamcoback.scene.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.JsonNode; +import com.kamco.cd.kamcoback.enums.ApiConfigEnum.EnumDto; +import com.kamco.cd.kamcoback.enums.CommonUseStatus; +import com.kamco.cd.kamcoback.inference.dto.InferenceDetailDto; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.persistence.EntityNotFoundException; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +public class MapInkxMngDto { + + // CommonUseStatus class로 통합 20251230 + // @CodeExpose + // @Getter + // @AllArgsConstructor + // public enum UseInferenceType implements EnumType { + // USE("사용중"), + // EXCEPT("영구 추론제외"); + // + // private final String desc; + // + // @Override + // public String getId() { + // return name(); + // } + // + // @Override + // public String getText() { + // return desc; + // } + // } + + @Schema(name = "Basic", description = "Basic") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class Basic { + + private Integer fid; + private String mapidcdNo; + private String mapidNm; + private JsonNode geom; + private String useInference; + private ZonedDateTime createdDttm; + private ZonedDateTime updatedDttm; + } + + @Getter + @Schema(name = "MapListEntity", description = "목록 항목") + public static class MapListEntity { + + private InferenceDetailDto.MapSheet scene50k; + private InferenceDetailDto.MapSheet scene5k; + private CommonUseStatus useInference; + + @JsonFormat( + shape = JsonFormat.Shape.STRING, + pattern = "yyyy-MM-dd'T'HH:mm:ssXXX", + timezone = "Asia/Seoul") + private ZonedDateTime createdDttm; + + @JsonFormat( + shape = JsonFormat.Shape.STRING, + pattern = "yyyy-MM-dd'T'HH:mm:ssXXX", + timezone = "Asia/Seoul") + private ZonedDateTime updatedDttm; + + public EnumDto getUseInference() { + EnumDto enumDto = useInference.getEnumDto(); + return enumDto; + } + + @Builder + public MapListEntity( + InferenceDetailDto.MapSheet scene50k, + InferenceDetailDto.MapSheet scene5k, + CommonUseStatus useInference, + ZonedDateTime createdDttm, + ZonedDateTime updatedDttm) { + this.scene50k = scene50k; + this.scene5k = scene5k; + this.useInference = useInference; + this.createdDttm = createdDttm; + this.updatedDttm = updatedDttm; + } + } + + @Schema(name = "MapList", description = "목록 항목") + @Getter + @Setter + @NoArgsConstructor + public static class MapList { + + private Integer rowNum; + private String mapidcdNo5k; + private String mapidcdNo50k; + private String mapidNm; + private String createdDttm; + private String updatedDttm; + private String useInference; + private ZonedDateTime createdDttmTime; + private ZonedDateTime updatedDttmTime; + + // 목록 Querydsl 에서 리턴 받는 건 생성자 기준임 -> 쿼리 컬럼 그대로 받고 여기서 Java 형변환 해서 return 하기 + public MapList( + Integer rowNum, + String mapidcdNo5k, + String mapidcdNo50k, + String mapidNm, + ZonedDateTime createdDttmTime, + ZonedDateTime updatedDttmTime, + CommonUseStatus useInference) { + this.rowNum = rowNum; + this.mapidcdNo5k = mapidcdNo5k; + this.mapidcdNo50k = mapidcdNo50k; + this.mapidNm = mapidNm; + + DateTimeFormatter fmt = + DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.of("Asia/Seoul")); + this.createdDttm = fmt.format(createdDttmTime); + this.updatedDttm = fmt.format(updatedDttmTime); + this.createdDttmTime = createdDttmTime; + this.updatedDttmTime = updatedDttmTime; + this.useInference = useInference.getId(); + } + } + + @Schema(name = "searchReq", description = "검색 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class searchReq { + + // 페이징 파라미터 + private int page = 0; + private int size = 20; + private String sort; + + public Pageable toPageable() { + if (sort != null && !sort.isEmpty()) { + String[] sortParams = sort.split(","); + String property = sortParams[0]; + Sort.Direction direction = + sortParams.length > 1 ? Sort.Direction.fromString(sortParams[1]) : Sort.Direction.ASC; + return PageRequest.of(page, size, Sort.by(direction, property)); + } + return PageRequest.of(page, size); + } + } + + @Schema(name = "AddMapReq", description = "등록 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class AddMapReq { + + @Schema(description = "도엽번호", example = "31540687") + private String mapidcdNo; + + @Schema(description = "도엽명", example = "공덕") + private String mapidNm; + + @Schema( + description = "좌표 목록 (한 줄에 한 점, '경도 위도' 형식)", + example = + "127.17500001632317 36.17499998262991\n" + + "127.14999995475043 36.17500002877932\n" + + "127.15000004313612 36.199999984012415\n" + + "127.1750000466954 36.20000001863179") + private String coordinates; + } + + @Schema(name = "UseInferReq", description = "추론제외 업데이트 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class UseInferReq { + + private String mapidcdNo; + private CommonUseStatus useInference; // 변경하고자하는 상태 + + public void valid() { + if (mapidcdNo == null || mapidcdNo.isEmpty()) { + throw new IllegalArgumentException("도엽번호는 필수 입력값입니다."); + } + // 공백제거 + mapidcdNo = mapidcdNo.trim(); + + if (!mapidcdNo.matches("^\\d{8}$")) { + throw new EntityNotFoundException("도엽번호는 8자리 숫자로 구성되어야 합니다."); + } + } + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class Search5kReq { + + private String mapidcdNo; + private String useInference; + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiService.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiService.java new file mode 100644 index 0000000..48c0a7d --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiService.java @@ -0,0 +1,390 @@ +package com.kamco.cd.kamcoback.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.kamco.cd.kamcoback.common.utils.NetUtils; +import com.kamco.cd.kamcoback.config.api.ApiResponseDto.ApiResponseCode; +import com.kamco.cd.kamcoback.config.api.ApiResponseDto.ResponseObj; +import com.kamco.cd.kamcoback.config.resttemplate.ExternalHttpClient; +import com.kamco.cd.kamcoback.config.resttemplate.ExternalHttpClient.ExternalCallResult; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto.ContBasic; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto.ReqInfo; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto.ResultContDto; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectContDto.ResultPnuDto; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.ChnDetectMastReqDto; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.ErrorResDto; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LabelSendDto; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.ResultDto; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.RlbDtctDto; +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.GukYuinLinkFacts; +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.GukYuinLinkFailCode; +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinDto.LearnInfo; +import com.kamco.cd.kamcoback.postgres.core.GukYuinCoreService; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.LocalDate; +import java.util.List; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Service +@Transactional +@RequiredArgsConstructor +public class GukYuinApiService { + + private final GukYuinCoreService gukyuinCoreService; + private final ExternalHttpClient externalHttpClient; + private final NetUtils netUtils = new NetUtils(); + + private final ObjectMapper objectMapper; + private final String myip = netUtils.getLocalIP(); + + @Value("${spring.profiles.active:local}") + private String profile; + + @Value("${gukyuin.url}") + private String gukyuinUrl; + + @Value("${gukyuin.cdi}") + private String gukyuinCdiUrl; + + @Value("${file.dataset-dir}") + private String datasetDir; + + @Transactional + public ChngDetectMastDto.RegistResDto regist(ChnDetectMastReqDto chnDetectMastReq) { + + String url = gukyuinCdiUrl + "/chn/mast/regist"; + + chnDetectMastReq.setReqIp(myip); + chnDetectMastReq.setReqEpno("BATCH"); + + ExternalCallResult result = + externalHttpClient.call( + url, + HttpMethod.POST, + chnDetectMastReq, + netUtils.jsonHeaders(), + ChngDetectMastDto.RegistResDto.class); + + ChngDetectMastDto.RegistResDto resultBody = result.body(); + boolean success = false; + if (resultBody != null && resultBody.getSuccess() != null) { + ChngDetectMastDto.Basic registRes = resultBody.getResult(); + + success = resultBody.getSuccess(); + + // 이미 등록한 경우에는 result가 없음 + if (resultBody.getResult() == null) { + return resultBody; + } + + // 추론 회차에 applyStatus, applyStatusDttm 업데이트 + gukyuinCoreService.updateGukYuinMastRegResult(registRes); + + // anal_inference 에도 국유인 반영여부, applyDttm 업데이트 + gukyuinCoreService.updateAnalInferenceApplyDttm(registRes); + } else { + String errBody = result.errBody(); + ErrorResDto error = null; + try { + error = objectMapper.readValue(errBody, ErrorResDto.class); + return new ChngDetectMastDto.RegistResDto(error.getStatus(), error.getError(), null, false); + } catch (JsonProcessingException e) { + log.error("에러 응답 파싱 실패. rawBody={}", errBody, e); + return new ChngDetectMastDto.RegistResDto( + result.statusCode(), // HTTP status + errBody, // 원문 그대로 + null, + false); + } + } + + return resultBody; + } + + @Transactional + public ChngDetectMastDto.RemoveResDto remove(ChnDetectMastReqDto chnDetectMastReq) { + String url = gukyuinCdiUrl + "/chn/mast/remove"; + + chnDetectMastReq.setReqIp(myip); + chnDetectMastReq.setReqEpno("BATCH"); + + boolean success = false; + ExternalCallResult result = + externalHttpClient.call( + url, + HttpMethod.POST, + chnDetectMastReq, + netUtils.jsonHeaders(), + ChngDetectMastDto.RemoveResDto.class); + + ChngDetectMastDto.RemoveResDto resultBody = result.body(); + if (resultBody != null && resultBody.getSuccess() != null) { + + success = resultBody.getSuccess(); + if (resultBody.getSuccess()) { + gukyuinCoreService.updateGukYuinMastRegRemove(chnDetectMastReq.getChnDtctId()); + } + } + + return resultBody; + } + + // 등록목록 1개 확인 + public ResultDto detail(String chnDtctMstId) { + + String url = + gukyuinCdiUrl + "/chn/mast/list/" + chnDtctMstId + "?reqIp=" + myip + "&reqEpno=" + "BATCH"; + + ExternalCallResult result = + externalHttpClient.call(url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultDto.class); + + return result.body(); + } + + // 등록목록 비교년도,기준년도,차수 조합해서 n개 확인 + public ResultDto listYearStage(ChngDetectMastDto.ChngDetectMastSearchDto searchDto) { + String queryString = netUtils.dtoToQueryString(searchDto, null); + String url = + gukyuinCdiUrl + "/chn/mast" + queryString + "&reqIp=" + myip + "&reqEpno=" + "BATCH"; + + ExternalCallResult result = + externalHttpClient.call(url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultDto.class); + + return result.body(); + } + + private GukYuinLinkFailCode decideCode(GukYuinLinkFacts f) { + + if (!f.existsLearn()) { + return GukYuinLinkFailCode.NOT_FOUND; + } + + if (f.isPartScope()) { + return GukYuinLinkFailCode.SCOPE_PART_NOT_ALLOWED; + } + + if (f.hasRunningInference()) { + return GukYuinLinkFailCode.HAS_RUNNING_INFERENCE; + } + + if (f.hasOtherUnfinishedGukYuin()) { + return GukYuinLinkFailCode.OTHER_GUKYUIN_IN_PROGRESS; + } + + return GukYuinLinkFailCode.OK; + } + + // 탐지객체 리스트 조회 + public ResultContDto findChnContList( + String chnDtctId, Integer pageIndex, Integer pageSize, String batchYn) { + + String url = + gukyuinCdiUrl + + "/chn/cont/" + + chnDtctId + + "?pageIndex=" + + pageIndex + + "&pageSize=" + + pageSize + + "&reqIp=" + + myip + + "&reqEpno=" + + "BATCH"; + + ExternalCallResult result = + externalHttpClient.call( + url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultContDto.class); + + List contList = result.body().getResult(); + if (contList == null || contList.isEmpty()) { + return new ResultContDto( + result.body().getCode(), + result.body().getMessage(), + result.body().getResult(), + result.body().getSuccess()); + } + + return result.body(); + } + + public ResultPnuDto findPnuObjMgmtList(String chnDtctId, String chnDtctObjtId) { + String url = + gukyuinCdiUrl + + "/chn/pnu/" + + chnDtctId + + "/objt/" + + chnDtctObjtId + + "?reqIp=" + + myip + + "&reqEpno=" + + "BATCH"; + + ExternalCallResult result = + externalHttpClient.call( + url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultPnuDto.class); + + return result.body(); + } + + public ChngDetectContDto.ResultLabelDto updateChnDtctObjtLabelingYn( + String chnDtctObjtId, String lblYn, String batchYn) { + String url = gukyuinCdiUrl + "/rlb/objt/" + chnDtctObjtId + "/lbl/" + lblYn; + + ReqInfo info = new ReqInfo(); + info.setReqIp(myip); + info.setReqEpno("BATCH"); + + ExternalCallResult result = + externalHttpClient.call( + url, + HttpMethod.POST, + info, + netUtils.jsonHeaders(), + ChngDetectContDto.ResultLabelDto.class); + + return result.body(); + } + + public ResultContDto findChnPnuToContList(String chnDtctId, String pnu) { + + String url = + gukyuinCdiUrl + + "/chn/cont/" + + chnDtctId + + "/pnu/" + + pnu + + "?reqIp=" + + myip + + "&reqEpno=" + + "BATCH"; + + ExternalCallResult result = + externalHttpClient.call( + url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultContDto.class); + + return result.body(); + } + + public ResultDto listChnDtctId(String chnDtctId, String batchYn) { + String url = + gukyuinCdiUrl + "/chn/mast/" + chnDtctId + "?reqIp=" + myip + "&reqEpno=" + "BATCH"; + + ExternalCallResult result = + externalHttpClient.call(url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultDto.class); + + return result.body(); + } + + public ResponseObj connectChnMastRegist(UUID uuid) { + // uuid로 추론 회차 조회 + LearnInfo info = gukyuinCoreService.findMapSheetLearnInfo(uuid); + if (info.getApplyYn() != null && info.getApplyYn()) { + return new ResponseObj(ApiResponseCode.DUPLICATE_DATA, "이미 국유인 연동을 한 회차입니다."); + } + + if (!Files.isDirectory(Path.of("/kamco-nfs/dataset/export/" + info.getUid()))) { + return new ResponseObj( + ApiResponseCode.NOT_FOUND_DATA, "파일 경로에 회차 실행 파일이 생성되지 않았습니다. 확인 부탁드립니다."); + } + + // 비교년도,기준년도로 전송한 데이터 있는지 확인 후 회차 번호 생성 + Integer maxStage = + gukyuinCoreService.findMapSheetLearnYearStage(info.getCompareYyyy(), info.getTargetYyyy()); + + // reqDto 셋팅 + ChnDetectMastReqDto reqDto = new ChnDetectMastReqDto(); + reqDto.setCprsYr(String.valueOf(info.getCompareYyyy())); + reqDto.setCrtrYr(String.valueOf(info.getTargetYyyy())); + reqDto.setChnDtctSno(String.valueOf(maxStage + 1)); + reqDto.setChnDtctId(info.getUid()); + reqDto.setPathNm("/kamco-nfs/dataset/export/" + info.getUid()); + + // 1회차를 종료 상태로 처리하고 2회차를 보내야 함 + // 추론(learn), 학습데이터(inference) 둘 다 종료 처리 + if (maxStage > 0) { + Long learnId = + gukyuinCoreService.findMapSheetLearnInfoByYyyy( + info.getCompareYyyy(), info.getTargetYyyy(), maxStage); + gukyuinCoreService.updateMapSheetLearnGukyuinEndStatus(learnId); + gukyuinCoreService.updateMapSheetInferenceLabelEndStatus(learnId); + } + + // 국유인 /chn/mast/regist 전송 + ChngDetectMastDto.RegistResDto result = this.regist(reqDto); + if (result.getSuccess()) { + return new ResponseObj(ApiResponseCode.OK, "연동되었습니다."); + } else { + return new ResponseObj(ApiResponseCode.INTERNAL_SERVER_ERROR, result.getMessage()); + } + } + + public List findLabelingCompleteSendList(LocalDate yesterday) { + return gukyuinCoreService.findLabelingCompleteSendList(yesterday); + } + + public ResultContDto findChnPnuToContObject( + String chnDtctId, String chnDtctObjtId, Integer pageIndex, Integer pageSize) { + + String url = + gukyuinCdiUrl + + "/chn/cont/" + + chnDtctId + + "/chnDtctObjtId/" + + chnDtctObjtId + + "?pageIndex=" + + pageIndex + + "&pageSize=" + + pageSize + + "&reqIp=" + + myip + + "&reqEpno=" + + "BATCH"; + + ExternalCallResult result = + externalHttpClient.call( + url, HttpMethod.GET, null, netUtils.jsonHeaders(), ResultContDto.class); + + return result.body(); + } + + public RlbDtctDto findRlbDtctList(String chnDtctId, String yyyymmdd, String batchYn) { + + String url = + gukyuinCdiUrl + + "/rlb/dtct/" + + chnDtctId + + "?reqIp=" + + myip + + "&reqEpno=" + + "BATCH" + + "&yyyymmdd=" + + yyyymmdd; + + ExternalCallResult result = + externalHttpClient.call( + url, HttpMethod.GET, null, netUtils.jsonHeaders(), RlbDtctDto.class); + + return result.body(); + } + + public RlbDtctDto findRlbDtctObject(String chnDtctObjtId) { + String url = + gukyuinCdiUrl + "/rlb/objt/" + chnDtctObjtId + "?reqIp=" + myip + "&reqEpno=" + "BATCH"; + + ExternalCallResult result = + externalHttpClient.call( + url, HttpMethod.GET, null, netUtils.jsonHeaders(), RlbDtctDto.class); + + return result.body(); + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.java new file mode 100644 index 0000000..9548a51 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/GukYuinApiStatusJobService.java @@ -0,0 +1,68 @@ +package com.kamco.cd.kamcoback.service; + +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto; +import com.kamco.cd.kamcoback.gukyuin.dto.ChngDetectMastDto.LearnKeyDto; +import com.kamco.cd.kamcoback.gukyuin.dto.GukYuinStatus; +import com.kamco.cd.kamcoback.postgres.core.GukYuinJobCoreService; +import com.kamco.cd.kamcoback.postgres.core.GukYuinPnuCntUpdateJobCoreService; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Log4j2 +@Service +@RequiredArgsConstructor +public class GukYuinApiStatusJobService { + + private final GukYuinJobCoreService gukYuinJobCoreService; + private final GukYuinApiService gukYuinApiService; + private final GukYuinPnuCntUpdateJobCoreService gukYuinPnuCntUpdateJobCoreService; + + @Value("${spring.profiles.active}") + private String profile; + + /** + * 실행중인 profile + * + * @return + */ + private boolean isLocalProfile() { + return "local".equalsIgnoreCase(profile); + } + + /** 매일 00시에 pnu cnt 업데이트 */ + public void findGukYuinPnuCntUpdate() { + + List list = + gukYuinJobCoreService.findGukyuinApplyStatusUidList( + List.of(GukYuinStatus.IN_PROGRESS.getId())); + if (list.isEmpty()) { + return; + } + + for (LearnKeyDto dto : list) { + try { + ChngDetectMastDto.ResultDto result = gukYuinApiService.listChnDtctId(dto.getUid(), "Y"); + + if (result == null || result.getResult() == null || result.getResult().isEmpty()) { + log.warn("[GUKYUIN] empty result chnDtctMstId={}", dto.getChnDtctMstId()); + continue; + } + + ChngDetectMastDto.Basic basic = result.getResult().getFirst(); + + Integer progress = + basic.getExcnPgrt() == null ? null : Integer.parseInt(basic.getExcnPgrt().trim()); + if (progress != null && progress == 100) { + gukYuinPnuCntUpdateJobCoreService.updateGukYuinContListPnuUpdateCnt(); + gukYuinPnuCntUpdateJobCoreService.updateGukYuinApplyStatus( + dto.getUid(), GukYuinStatus.PNU_COMPLETED.getId()); + } + } catch (Exception e) { + log.error("[GUKYUIN] failed uid={}", dto.getChnDtctMstId(), e); + } + } + } +} diff --git a/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/StatusUpdateRunner.java b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/StatusUpdateRunner.java new file mode 100644 index 0000000..c52b842 --- /dev/null +++ b/gukyuin/status-update/src/main/java/com/kamco/cd/kamcoback/service/StatusUpdateRunner.java @@ -0,0 +1,17 @@ +package com.kamco.cd.kamcoback.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class StatusUpdateRunner implements CommandLineRunner { + + private final GukYuinApiStatusJobService jobService; + + @Override + public void run(String... args) { + jobService.findGukYuinPnuCntUpdate(); + } +} diff --git a/gukyuin/status-update/src/main/resources/application-dev.yml b/gukyuin/status-update/src/main/resources/application-dev.yml new file mode 100644 index 0000000..2081606 --- /dev/null +++ b/gukyuin/status-update/src/main/resources/application-dev.yml @@ -0,0 +1,60 @@ +spring: + config: + activate: + on-profile: dev + + jpa: + show-sql: false + hibernate: + ddl-auto: validate + properties: + hibernate: + default_batch_fetch_size: 100 # ✅ 성능 - N+1 쿼리 방지 + order_updates: true # ✅ 성능 - 업데이트 순서 정렬로 데드락 방지 + order_inserts: true + use_sql_comments: true # ⚠️ 선택 - SQL에 주석 추가 (디버깅용) + format_sql: true # ⚠️ 선택 - SQL 포맷팅 (가독성) + jdbc: + batch_size: 1000 # ✅ 추가 (JDBC batch) + open-in-view: false + mvc: + async: + request-timeout: 300s # 5분 (예: 30s, 120s, 10m 등도 가능) + + datasource: + url: jdbc:postgresql://192.168.2.127:15432/kamco_cds + #url: jdbc:postgresql://localhost:15432/kamco_cds + username: kamco_cds + password: kamco_cds_Q!W@E#R$ + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-timeout: 60000 # 60초 연결 타임아웃 + idle-timeout: 300000 # 5분 유휴 타임아웃 + max-lifetime: 1800000 # 30분 최대 수명 + leak-detection-threshold: 60000 # 연결 누수 감지 + + transaction: + default-timeout: 300 # 5분 트랜잭션 타임아웃 + + data: + redis: + host: 192.168.2.109 + port: 6379 + password: kamco + +logging: + level: + root: INFO + org.springframework.web: DEBUG + org.springframework.security: DEBUG + + # 헬스체크 노이즈 핵심만 다운 + org.springframework.security.web.FilterChainProxy: INFO + org.springframework.security.web.authentication.AnonymousAuthenticationFilter: INFO + org.springframework.security.web.authentication.Http403ForbiddenEntryPoint: INFO + org.springframework.web.servlet.DispatcherServlet: INFO + +gukyuin: + url: http://192.168.2.129:5301 + cdi: ${gukyuin.url}/api/kcd/cdi diff --git a/gukyuin/status-update/src/main/resources/application-local.yml b/gukyuin/status-update/src/main/resources/application-local.yml new file mode 100644 index 0000000..cb09429 --- /dev/null +++ b/gukyuin/status-update/src/main/resources/application-local.yml @@ -0,0 +1,114 @@ +spring: + config: + activate: + on-profile: local + + jpa: + show-sql: false + hibernate: + ddl-auto: validate # 로컬만 완화(시킬려면 update으로 변경) + properties: + hibernate: + default_batch_fetch_size: 100 # ✅ 성능 - N+1 쿼리 방지 + order_updates: true # ✅ 성능 - 업데이트 순서 정렬로 데드락 방지 + use_sql_comments: true # ⚠️ 선택 - SQL에 주석 추가 (디버깅용) + format_sql: true # ⚠️ 선택 - SQL 포맷팅 (가독성) + + datasource: + url: jdbc:postgresql://192.168.2.127:15432/kamco_cds + # url: jdbc:postgresql://localhost:5432/local_0128 + username: kamco_cds + password: kamco_cds_Q!W@E#R$ + # username: postgres + # password: 1234 + hikari: + minimum-idle: 1 + maximum-pool-size: 5 + + data: + redis: + host: 192.168.2.109 + port: 6379 + password: kamco + + servlet: + multipart: + enabled: true + max-file-size: 4GB + max-request-size: 4GB + file-size-threshold: 10MB + +server: + tomcat: + max-swallow-size: 4GB + max-http-form-post-size: 4GB + +jwt: + secret: "kamco_token_9b71e778-19a3-4c1d-97bf-2d687de17d5b" + access-token-validity-in-ms: 86400000 # 1일 + refresh-token-validity-in-ms: 604800000 # 7일 + +token: + refresh-cookie-name: kamco-local # 개발용 쿠키 이름 + refresh-cookie-secure: false # 로컬 http 테스트면 false + +springdoc: + swagger-ui: + persist-authorization: true # 스웨거 새로고침해도 토큰 유지, 로컬스토리지에 저장 + +logging: + level: + org.hibernate.SQL: debug + org.hibernate.orm.jdbc.bind: trace + +mapsheet: + upload: + skipGdalValidation: true + shp: + baseurl: /Users/bokmin/detect/result + + + +file: + sync-root-dir: C:/Users/gypark/kamco-nfs/images/ + #sync-root-dir: /kamco-nfs/images/ + sync-tmp-dir: ${file.sync-root-dir}/tmp/ + sync-file-extention: tfw,tif + sync-auto-exception-start-year: 2025 + sync-auto-exception-before-year-cnt: 3 + + dataset-dir: C:/Users/gypark/kamco-nfs/dataset/ + #dataset-dir: /kamco-nfs/dataset/export/ + dataset-tmp-dir: ${file.dataset-dir}tmp/ + + model-dir: C:/Users/gypark/kamco-nfs/ckpt/model/ + #model-dir: /kamco-nfs/ckpt/model/ + model-tmp-dir: ${file.model-dir}tmp/ + model-file-extention: pth,json,py + + pt-path: /kamco-nfs/ckpt/classification/ + pt-FileName: v5-best.pt + + dataset-response: /kamco-nfs/dataset/response/ + +inference: + url: http://10.100.0.11:8000/jobs + batch-url: http://10.100.0.11:8000/batches + geojson-dir: /kamco-nfs/requests/ + jar-path: jar/makeshp-1.0.0.jar + inference-server-name: server1,server2,server3,server4 + +gukyuin: + #url: http://localhost:8080 + url: http://192.168.2.129:5301 + cdi: ${gukyuin.url}/api/kcd/cdi + +training-data: + geojson-dir: /kamco-nfs/model_output/labeling/ + +layer: + geoserver-url: https://kamco.geo-dev.gs.dabeeo.com + wms-path: geoserver/cd + wmts-path: geoserver/cd/gwc/service + workspace: cd + diff --git a/gukyuin/status-update/src/main/resources/application-prod.yml b/gukyuin/status-update/src/main/resources/application-prod.yml new file mode 100644 index 0000000..bcdba91 --- /dev/null +++ b/gukyuin/status-update/src/main/resources/application-prod.yml @@ -0,0 +1,48 @@ +spring: + config: + activate: + on-profile: prod + + jpa: + show-sql: true + hibernate: + ddl-auto: validate + properties: + hibernate: + default_batch_fetch_size: 100 # ✅ 성능 - N+1 쿼리 방지 + order_updates: true # ✅ 성능 - 업데이트 순서 정렬로 데드락 방지 + order_inserts: true + use_sql_comments: true # ⚠️ 선택 - SQL에 주석 추가 (디버깅용) + format_sql: true # ⚠️ 선택 - SQL 포맷팅 (가독성) + jdbc: + batch_size: 1000 # ✅ 추가 (JDBC batch) + open-in-view: false + mvc: + async: + request-timeout: 300s # 5분 (예: 30s, 120s, 10m 등도 가능) + + datasource: + url: jdbc:postgresql://kamco-cd-postgis:5432/kamco_cds + username: kamco_cds + password: kamco_cds_Q!W@E#R$ + hikari: + minimum-idle: 10 + maximum-pool-size: 20 + connection-timeout: 60000 # 60초 연결 타임아웃 + idle-timeout: 300000 # 5분 유휴 타임아웃 + max-lifetime: 1800000 # 30분 최대 수명 + leak-detection-threshold: 60000 # 연결 누수 감지 + + transaction: + default-timeout: 300 # 5분 트랜잭션 타임아웃 + +logging: + level: + root: INFO + org.springframework.web: DEBUG + org.springframework.security: DEBUG + +gukyuin: + url: http://172.16.4.56:15432 + cdi: ${gukyuin.url}/api/kcd/cdi + diff --git a/gukyuin/status-update/src/main/resources/application.yml b/gukyuin/status-update/src/main/resources/application.yml new file mode 100644 index 0000000..bebc73d --- /dev/null +++ b/gukyuin/status-update/src/main/resources/application.yml @@ -0,0 +1,8 @@ +server: + port: 8080 + +spring: + application: + name: kamco-gukyuin-label + profiles: + active: prod # 사용할 프로파일 지정 (ex. dev, prod, test) diff --git a/gukyuin/status-update/src/main/resources/static/chunk_upload_test.html b/gukyuin/status-update/src/main/resources/static/chunk_upload_test.html new file mode 100644 index 0000000..2c331d4 --- /dev/null +++ b/gukyuin/status-update/src/main/resources/static/chunk_upload_test.html @@ -0,0 +1,137 @@ + + + + + Chunk Upload Test + + +

대용량 파일 청크 업로드 테스트

+ +* Chunk 테스트 사이즈 10M (10 * 1024 * 1024) - 성능에 따라 변경가능

+ +* 업로드 API선택

+ +

+* 파일첨부

+

+ +



+* 업로드시 업로드 이력을 추적하기 위해 UUID생성해서 전달(파일병합시 사용)(script 예제참고)

+UUID :

+ +* API 호출시 파일정보 추출해서 자동 할당해야 함.(script 예제참고)

+chunkIndex :

+chunkTotalIndex :

+ +* API 호출시 파일정보 추출해서 자동 할당해야 함.(script 예제참고)

+fileSize :

+ + + +

+* 진행율(%)

+
+

+* 결과메세지

+
+ + + +