diff --git a/gradle/linux/pack_offline_bundle_airgap.sh b/gradle/linux/pack_offline_bundle_airgap.sh new file mode 100644 index 00000000..9cc9fc5f --- /dev/null +++ b/gradle/linux/pack_offline_bundle_airgap.sh @@ -0,0 +1,550 @@ +#!/bin/bash +# pack_offline_bundle_airgap.sh +# ============================================================================ +# Gradle Offline Bundle Packer +# ============================================================================ +# Version: 4.0 +# +# WORKFLOW: +# 1. [ONLINE] Build project (./gradlew bootJar) - downloads all deps +# 2. [ONLINE] Test run (./gradlew bootRun) - verify app works +# 3. [OFFLINE TEST] Verify offline build works +# 4. Create bundle with all cached dependencies +# +# REQUIREMENTS: +# - Internet connection (for initial build) +# - Project with gradlew +# ============================================================================ + +set -e + +# ============================================================================ +# Configuration +# ============================================================================ +WRAPPER_SEED_PATH="wrapper_jar_seed" +OFFLINE_HOME_NAME="_offline_gradle_home" +BOOTRUN_TIMEOUT_SECONDS=60 + +# Color codes +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +GRAY='\033[0;90m' +WHITE='\033[1;37m' +NC='\033[0m' # No Color + +echo "" +echo -e "${CYAN}============================================================${NC}" +echo -e "${CYAN} Gradle Offline Bundle Packer v4.0${NC}" +echo -e "${CYAN}============================================================${NC}" +echo "" +echo -e "${WHITE} This script will:${NC}" +echo -e "${GRAY} 1. Build project with internet (download dependencies)${NC}" +echo -e "${GRAY} 2. Test run application (verify it works)${NC}" +echo -e "${GRAY} 3. Test offline build (verify cache is complete)${NC}" +echo -e "${GRAY} 4. Create offline bundle for air-gapped environment${NC}" +echo "" +echo -e "${CYAN}============================================================${NC}" +echo "" + +# ============================================================================ +# [1/20] Check Current Directory +# ============================================================================ +echo -e "${YELLOW}==[1/20] Check Current Directory ==${NC}" +ROOT="$(pwd)" +echo "ROOT_DIR: $ROOT" +echo "" + +# ============================================================================ +# [2/20] Check Required Files +# ============================================================================ +echo -e "${YELLOW}==[2/20] Check Required Files ==${NC}" + +if [ ! -f "./gradlew" ]; then + echo -e "${RED}ERROR: gradlew not found. Run from project root.${NC}" + exit 1 +fi +chmod +x ./gradlew +echo -e "${GREEN}[OK] gradlew${NC}" + +BUILD_FILE="" +if [ -f "./build.gradle" ]; then + BUILD_FILE="build.gradle" +elif [ -f "./build.gradle.kts" ]; then + BUILD_FILE="build.gradle.kts" +else + echo -e "${RED}ERROR: build.gradle(.kts) not found.${NC}" + exit 1 +fi +echo -e "${GREEN}[OK] $BUILD_FILE${NC}" + +SETTINGS_FILE="" +if [ -f "./settings.gradle" ]; then + SETTINGS_FILE="settings.gradle" + echo -e "${GREEN}[OK] $SETTINGS_FILE${NC}" +elif [ -f "./settings.gradle.kts" ]; then + SETTINGS_FILE="settings.gradle.kts" + echo -e "${GREEN}[OK] $SETTINGS_FILE${NC}" +fi +echo "" + +# ============================================================================ +# [3/20] Check Gradle Wrapper +# ============================================================================ +echo -e "${YELLOW}==[3/20] Check Gradle Wrapper ==${NC}" + +WRAPPER_DIR="$ROOT/gradle/wrapper" +WRAPPER_JAR="$WRAPPER_DIR/gradle-wrapper.jar" +WRAPPER_PROP="$WRAPPER_DIR/gradle-wrapper.properties" + +mkdir -p "$WRAPPER_DIR" + +if [ ! -f "$WRAPPER_PROP" ]; then + echo -e "${RED}ERROR: gradle-wrapper.properties not found.${NC}" + exit 1 +fi + +if [ ! -f "$WRAPPER_JAR" ]; then + SEED_JAR="$ROOT/$WRAPPER_SEED_PATH/gradle-wrapper.jar" + if [ -f "$SEED_JAR" ]; then + cp "$SEED_JAR" "$WRAPPER_JAR" + echo -e "${GREEN}[OK] Wrapper jar injected from seed${NC}" + else + echo -e "${RED}ERROR: gradle-wrapper.jar missing${NC}" + exit 1 + fi +else + echo -e "${GREEN}[OK] gradle-wrapper.jar exists${NC}" +fi + +# Create seed backup +SEED_DIR="$ROOT/$WRAPPER_SEED_PATH" +if [ ! -d "$SEED_DIR" ]; then + mkdir -p "$SEED_DIR" + cp "$WRAPPER_JAR" "$SEED_DIR/gradle-wrapper.jar" +fi +echo "" + +# ============================================================================ +# [4/20] Set GRADLE_USER_HOME (Project Local) +# ============================================================================ +echo -e "${YELLOW}==[4/20] Set GRADLE_USER_HOME ==${NC}" + +OFFLINE_HOME="$ROOT/$OFFLINE_HOME_NAME" +mkdir -p "$OFFLINE_HOME" +export GRADLE_USER_HOME="$OFFLINE_HOME" + +echo -e "${CYAN}GRADLE_USER_HOME = $GRADLE_USER_HOME${NC}" +echo -e "${GRAY}[INFO] All dependencies will be cached in project folder${NC}" +echo "" + +# ============================================================================ +# [5/20] Check Internet Connection +# ============================================================================ +echo -e "${YELLOW}==[5/20] Check Internet Connection ==${NC}" + +HAS_INTERNET=false +TEST_HOSTS=("plugins.gradle.org" "repo.maven.apache.org" "repo1.maven.org") + +for TEST_HOST in "${TEST_HOSTS[@]}"; do + if ping -c 1 -W 3 "$TEST_HOST" &>/dev/null; then + HAS_INTERNET=true + echo -e "${GREEN}[OK] Connected to $TEST_HOST${NC}" + break + fi +done + +if [ "$HAS_INTERNET" = false ]; then + # Try DNS resolution as fallback + if nslookup google.com &>/dev/null || host google.com &>/dev/null; then + HAS_INTERNET=true + echo -e "${GREEN}[OK] Internet available (DNS)${NC}" + fi +fi + +if [ "$HAS_INTERNET" = false ]; then + echo "" + echo -e "${RED}============================================================${NC}" + echo -e "${RED} ERROR: No Internet Connection!${NC}" + echo -e "${RED}============================================================${NC}" + echo "" + echo -e "${YELLOW}This script requires internet for initial build.${NC}" + echo -e "${YELLOW}Please connect to internet and run again.${NC}" + echo "" + exit 1 +fi +echo "" + +# ============================================================================ +# [6/20] Initial Gradle Setup +# ============================================================================ +echo -e "${YELLOW}==[6/20] Initial Gradle Setup ==${NC}" +echo -e "${GRAY}[INFO] Downloading Gradle distribution...${NC}" + +if ./gradlew --version &>/dev/null; then + GRADLE_VERSION=$(./gradlew --version 2>&1 | grep "^Gradle" | awk '{print $2}') + echo -e "${GREEN}[OK] Gradle $GRADLE_VERSION${NC}" +else + echo -e "${RED}[ERROR] Gradle setup failed${NC}" + exit 1 +fi +echo "" + +# ============================================================================ +# [7/20] ONLINE BUILD - bootJar (Download All Dependencies) +# ============================================================================ +echo -e "${YELLOW}==[7/20] ONLINE BUILD - bootJar ==${NC}" +echo "" +echo -e "${CYAN}============================================================${NC}" +echo -e "${CYAN} ONLINE BUILD (with Internet)${NC}" +echo -e "${CYAN} Downloading all dependencies to local cache${NC}" +echo -e "${CYAN}============================================================${NC}" +echo "" + +BUILD_SUCCESS=false + +./gradlew clean bootJar --no-daemon +if [ $? -eq 0 ]; then + BUILD_SUCCESS=true + echo "" + echo -e "${GREEN}============================================================${NC}" + echo -e "${GREEN} ONLINE BUILD SUCCESS!${NC}" + echo -e "${GREEN}============================================================${NC}" + echo "" + + if [ -d "./build/libs" ]; then + echo -e "${CYAN}JAR files:${NC}" + ls -lh ./build/libs/*.jar 2>/dev/null | awk '{print " " $9 " (" $5 ")"}' + fi +else + echo "" + echo -e "${RED}============================================================${NC}" + echo -e "${RED} BUILD FAILED!${NC}" + echo -e "${RED}============================================================${NC}" + echo "" + echo -e "${YELLOW}Build failed. Cannot continue.${NC}" + exit 1 +fi +echo "" + +# ============================================================================ +# [8/20] Stop Daemons +# ============================================================================ +echo -e "${YELLOW}==[8/20] Stop Daemons ==${NC}" + +./gradlew --stop &>/dev/null || true +sleep 2 +echo -e "${GREEN}[OK] Daemons stopped${NC}" +echo "" + +# ============================================================================ +# [9/20] ONLINE TEST - bootRun (Verify Application Works) +# ============================================================================ +echo -e "${YELLOW}==[9/20] ONLINE TEST - bootRun ==${NC}" +echo "" +echo -e "${CYAN}============================================================${NC}" +echo -e "${CYAN} Testing application startup (timeout: ${BOOTRUN_TIMEOUT_SECONDS}s)${NC}" +echo -e "${CYAN} Will automatically stop after successful startup${NC}" +echo -e "${CYAN}============================================================${NC}" +echo "" + +BOOTRUN_SUCCESS=false + +timeout ${BOOTRUN_TIMEOUT_SECONDS}s ./gradlew bootRun --no-daemon & +BOOTRUN_PID=$! + +sleep 10 + +if ps -p $BOOTRUN_PID &>/dev/null; then + BOOTRUN_SUCCESS=true + echo "" + echo -e "${GREEN}[OK] Application started successfully${NC}" + kill $BOOTRUN_PID &>/dev/null || true + sleep 2 +else + echo "" + echo -e "${YELLOW}[WARN] Application may not have started properly${NC}" +fi + +# Cleanup +pkill -f "gradle.*bootRun" &>/dev/null || true +sleep 2 +echo "" + +# ============================================================================ +# [10/20] Stop Daemons Again +# ============================================================================ +echo -e "${YELLOW}==[10/20] Stop Daemons Again ==${NC}" + +./gradlew --stop &>/dev/null || true +sleep 2 +echo -e "${GREEN}[OK] Daemons stopped${NC}" +echo "" + +# ============================================================================ +# [11/20] OFFLINE BUILD TEST (Verify Cache Completeness) +# ============================================================================ +echo -e "${YELLOW}==[11/20] OFFLINE BUILD TEST ==${NC}" +echo "" +echo -e "${CYAN}============================================================${NC}" +echo -e "${CYAN} OFFLINE BUILD TEST (--offline flag)${NC}" +echo -e "${CYAN} Verifying all dependencies are cached${NC}" +echo -e "${CYAN}============================================================${NC}" +echo "" + +OFFLINE_SUCCESS=false + +./gradlew clean bootJar --offline --no-daemon +if [ $? -eq 0 ]; then + OFFLINE_SUCCESS=true + echo "" + echo -e "${GREEN}============================================================${NC}" + echo -e "${GREEN} OFFLINE BUILD TEST PASSED!${NC}" + echo -e "${GREEN}============================================================${NC}" + echo "" + echo -e "${GREEN}[OK] All dependencies are cached${NC}" +else + echo "" + echo -e "${RED}============================================================${NC}" + echo -e "${RED} OFFLINE BUILD TEST FAILED!${NC}" + echo -e "${RED}============================================================${NC}" + echo "" + echo -e "${YELLOW}Some dependencies may be missing from cache.${NC}" + echo -e "${YELLOW}The bundle may not work in air-gapped environment.${NC}" + echo "" + + read -p "Continue anyway? (y/N): " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi +fi +echo "" + +# ============================================================================ +# [12/20] Stop Daemons Before Archive +# ============================================================================ +echo -e "${YELLOW}==[12/20] Stop Daemons Before Archive ==${NC}" + +./gradlew --stop &>/dev/null || true +sleep 2 +echo -e "${GREEN}[OK] Daemons stopped${NC}" +echo "" + +# ============================================================================ +# [13/20] Verify settings.gradle for Offline +# ============================================================================ +echo -e "${YELLOW}==[13/20] Verify settings.gradle ==${NC}" + +if [ -n "$SETTINGS_FILE" ]; then + if grep -q "mavenLocal()" "$SETTINGS_FILE" && grep -q "pluginManagement" "$SETTINGS_FILE"; then + echo -e "${GREEN}[OK] settings.gradle configured for offline${NC}" + else + echo -e "${YELLOW}[WARN] settings.gradle may need offline configuration${NC}" + echo -e "${GRAY}[INFO] Consider adding mavenLocal() to pluginManagement and repositories${NC}" + fi +else + echo -e "${GRAY}[INFO] No settings.gradle found${NC}" +fi +echo "" + +# ============================================================================ +# [14/20] Create Helper Scripts +# ============================================================================ +echo -e "${YELLOW}==[14/20] Create Helper Scripts ==${NC}" + +# run_offline_build.sh +cat > "$ROOT/run_offline_build.sh" << 'EOF' +#!/bin/bash +# run_offline_build.sh - Build JAR offline +export GRADLE_USER_HOME="$(pwd)/_offline_gradle_home" +echo "GRADLE_USER_HOME = $GRADLE_USER_HOME" +echo "" +./gradlew --offline bootJar --no-daemon +if [ $? -eq 0 ]; then + echo "" + echo "BUILD SUCCESS!" + echo "" + echo "JAR files:" + ls -lh ./build/libs/*.jar 2>/dev/null | awk '{print " " $9}' +else + echo "BUILD FAILED" +fi +EOF +chmod +x "$ROOT/run_offline_build.sh" +echo -e "${GREEN}[OK] run_offline_build.sh${NC}" + +# run_offline_bootrun.sh +cat > "$ROOT/run_offline_bootrun.sh" << 'EOF' +#!/bin/bash +# run_offline_bootrun.sh - Run application offline +export GRADLE_USER_HOME="$(pwd)/_offline_gradle_home" +echo "GRADLE_USER_HOME = $GRADLE_USER_HOME" +echo "" +echo "Starting application (Ctrl+C to stop)..." +echo "" +./gradlew --offline bootRun --no-daemon +EOF +chmod +x "$ROOT/run_offline_bootrun.sh" +echo -e "${GREEN}[OK] run_offline_bootrun.sh${NC}" +echo "" + +# ============================================================================ +# [15/20] Final Daemon Cleanup +# ============================================================================ +echo -e "${YELLOW}==[15/20] Final Daemon Cleanup ==${NC}" + +./gradlew --stop &>/dev/null || true +sleep 2 +echo -e "${GREEN}[OK] Daemons stopped${NC}" +echo "" + +# ============================================================================ +# [16/20] Clean Lock Files +# ============================================================================ +echo -e "${YELLOW}==[16/20] Clean Lock Files ==${NC}" + +DAEMON_DIR="$OFFLINE_HOME/daemon" +if [ -d "$DAEMON_DIR" ]; then + rm -rf "$DAEMON_DIR" 2>/dev/null || true +fi + +find "$OFFLINE_HOME" -type f \( -name "*.lock" -o -name "*.log" -o -name "*.tmp" \) -delete 2>/dev/null || true + +echo -e "${GREEN}[OK] Lock files cleaned${NC}" +echo "" + +# ============================================================================ +# [17/20] Calculate Cache Size +# ============================================================================ +echo -e "${YELLOW}==[17/20] Cache Summary ==${NC}" + +CACHES_DIR="$OFFLINE_HOME/caches" +WRAPPER_DISTS="$OFFLINE_HOME/wrapper/dists" + +TOTAL_SIZE=0 + +if [ -d "$CACHES_DIR" ]; then + SIZE=$(du -sb "$CACHES_DIR" 2>/dev/null | cut -f1) + TOTAL_SIZE=$((TOTAL_SIZE + SIZE)) + SIZE_MB=$(echo "scale=2; $SIZE / 1048576" | bc) + echo -e "${CYAN}[INFO] Dependencies: ${SIZE_MB} MB${NC}" +fi + +if [ -d "$WRAPPER_DISTS" ]; then + SIZE=$(du -sb "$WRAPPER_DISTS" 2>/dev/null | cut -f1) + TOTAL_SIZE=$((TOTAL_SIZE + SIZE)) + SIZE_MB=$(echo "scale=2; $SIZE / 1048576" | bc) + echo -e "${CYAN}[INFO] Gradle dist: ${SIZE_MB} MB${NC}" +fi + +TOTAL_MB=$(echo "scale=2; $TOTAL_SIZE / 1048576" | bc) +echo -e "${CYAN}[INFO] Total cache: ${TOTAL_MB} MB${NC}" +echo "" + +# ============================================================================ +# [18/20] Create Archive +# ============================================================================ +echo -e "${YELLOW}==[18/20] Create Archive ==${NC}" + +BASE_NAME=$(basename "$ROOT") +TIMESTAMP=$(date +"%Y%m%d_%H%M%S") +PARENT=$(dirname "$ROOT") +ARCHIVE_PATH="${PARENT}/${BASE_NAME}_offline_bundle_${TIMESTAMP}.tar.gz" + +echo "Archive: $ARCHIVE_PATH" +echo -e "${GRAY}[INFO] Creating archive (this may take several minutes)...${NC}" + +tar -czf "$ARCHIVE_PATH" \ + --exclude=".git" \ + --exclude=".idea" \ + --exclude=".DS_Store" \ + --exclude="*.log" \ + --exclude="*.lock" \ + --exclude="_offline_gradle_home/daemon" \ + --exclude="_offline_gradle_home/native" \ + --exclude="_offline_gradle_home/jdks" \ + --exclude="build" \ + --exclude="out" \ + --exclude=".gradle" \ + -C "$ROOT" . + +if [ $? -ne 0 ]; then + echo -e "${RED}ERROR: tar failed${NC}" + exit 1 +fi + +ARCHIVE_SIZE=$(stat -f%z "$ARCHIVE_PATH" 2>/dev/null || stat -c%s "$ARCHIVE_PATH" 2>/dev/null) +ARCHIVE_SIZE_MB=$(echo "scale=2; $ARCHIVE_SIZE / 1048576" | bc) +echo -e "${GREEN}[OK] Archive created: ${ARCHIVE_SIZE_MB} MB${NC}" +echo "" + +# ============================================================================ +# [19/20] Verify Archive +# ============================================================================ +echo -e "${YELLOW}==[19/20] Verify Archive ==${NC}" + +CHECKS=( + "gradle/wrapper/gradle-wrapper.jar" + "gradlew" + "_offline_gradle_home/caches" + "run_offline_build.sh" +) + +for CHECK in "${CHECKS[@]}"; do + if tar -tzf "$ARCHIVE_PATH" | grep -q "$CHECK"; then + echo -e " ${GREEN}[OK] $CHECK${NC}" + else + echo -e " ${YELLOW}[WARN] $CHECK${NC}" + fi +done +echo "" + +# ============================================================================ +# [20/20] Complete +# ============================================================================ +echo -e "${GREEN}============================================================${NC}" +echo -e "${GREEN} BUNDLE CREATION COMPLETE!${NC}" +echo -e "${GREEN}============================================================${NC}" +echo "" +echo -e "${CYAN}Archive: $ARCHIVE_PATH${NC}" +echo -e "${CYAN}Size: ${ARCHIVE_SIZE_MB} MB${NC}" +echo "" + +echo -e "${CYAN}============================================================${NC}" +echo -e "${CYAN} Test Results${NC}" +echo -e "${CYAN}============================================================${NC}" +if [ "$BUILD_SUCCESS" = true ]; then + echo -e " Online build (bootJar): ${GREEN}PASSED${NC}" +else + echo -e " Online build (bootJar): ${RED}FAILED${NC}" +fi +if [ "$BOOTRUN_SUCCESS" = true ]; then + echo -e " Online test (bootRun): ${GREEN}PASSED${NC}" +else + echo -e " Online test (bootRun): ${YELLOW}SKIPPED${NC}" +fi +if [ "$OFFLINE_SUCCESS" = true ]; then + echo -e " Offline build test: ${GREEN}PASSED${NC}" +else + echo -e " Offline build test: ${RED}FAILED${NC}" +fi +echo "" + +echo -e "${YELLOW}============================================================${NC}" +echo -e "${YELLOW} Usage in Air-gapped Environment${NC}" +echo -e "${YELLOW}============================================================${NC}" +echo "" +echo -e "${WHITE}Option 1: Use unpack script${NC}" +echo -e "${GRAY} ./unpack_and_offline_build_airgap.sh${NC}" +echo "" +echo -e "${WHITE}Option 2: Manual extraction${NC}" +echo -e "${GRAY} tar -xzf .tar.gz${NC}" +echo -e "${GRAY} cd ${NC}" +echo -e "${GRAY} ./run_offline_build.sh${NC}" +echo "" +echo -e "${WHITE}Option 3: Direct commands${NC}" +echo -e "${GRAY} export GRADLE_USER_HOME=\"./_offline_gradle_home\"${NC}" +echo -e "${GRAY} ./gradlew --offline bootJar --no-daemon${NC}" +echo "" diff --git a/gradle/linux/unpack_and_offline_build_airgap.sh b/gradle/linux/unpack_and_offline_build_airgap.sh new file mode 100644 index 00000000..b279202c --- /dev/null +++ b/gradle/linux/unpack_and_offline_build_airgap.sh @@ -0,0 +1,347 @@ +#!/bin/bash +# unpack_and_offline_build_airgap.sh +# ============================================================================ +# Execution Environment: OFFLINE (Air-gapped, No Internet) +# Purpose: Extract bundle and run offline build +# ============================================================================ +# Linux Bash Script +# Version: 3.1 +# +# IMPORTANT: This script automatically: +# 1. Extracts the archive +# 2. Sets GRADLE_USER_HOME to project local cache +# 3. Configures settings.gradle for offline resolution +# 4. Runs build with --offline flag +# ============================================================================ + +set -e + +# ============================================================================ +# Configuration +# ============================================================================ +WRAPPER_SEED_PATH="wrapper_jar_seed" +OFFLINE_HOME_NAME="_offline_gradle_home" + +# Color codes +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +GRAY='\033[0;90m' +WHITE='\033[1;37m' +NC='\033[0m' # No Color + +echo "" +echo -e "${CYAN}============================================================${NC}" +echo -e "${CYAN} Gradle Offline Build Runner${NC}" +echo -e "${CYAN} Environment: AIR-GAPPED (No Internet)${NC}" +echo -e "${CYAN} Mode: Fully Offline (--offline enforced)${NC}" +echo -e "${CYAN}============================================================${NC}" +echo "" + +# ============================================================================ +# [1/16] Check Current Directory +# ============================================================================ +echo -e "${YELLOW}==[1/16] Check Current Directory ==${NC}" +START_DIR="$(pwd)" +echo "PWD: $START_DIR" +echo "" + +# ============================================================================ +# [2/16] Select Archive +# ============================================================================ +echo -e "${YELLOW}==[2/16] Select Archive ==${NC}" + +ARCHIVE="" +if [ $# -ge 1 ]; then + ARCHIVE="$1" +fi + +if [ -z "$ARCHIVE" ]; then + # Auto-detect most recent .tar.gz file + ARCHIVE=$(find "$START_DIR" -maxdepth 1 -type f \( -name "*.tar.gz" -o -name "*.tgz" \) -printf '%T@ %p\n' 2>/dev/null | sort -rn | head -1 | cut -d' ' -f2-) + + if [ -z "$ARCHIVE" ]; then + echo -e "${RED}[ERROR] No archive found${NC}" + ls -lh "$START_DIR" + exit 1 + fi + + echo -e "${CYAN}[AUTO] $(basename "$ARCHIVE")${NC}" +else + if [ ! -f "$ARCHIVE" ]; then + ARCHIVE="$START_DIR/$ARCHIVE" + fi + echo -e "${CYAN}[USER] $(basename "$ARCHIVE")${NC}" +fi + +if [ ! -f "$ARCHIVE" ]; then + echo -e "${RED}ERROR: Archive not found: $ARCHIVE${NC}" + exit 1 +fi + +ARCHIVE_SIZE=$(stat -f%z "$ARCHIVE" 2>/dev/null || stat -c%s "$ARCHIVE" 2>/dev/null) +ARCHIVE_SIZE_MB=$(echo "scale=2; $ARCHIVE_SIZE / 1048576" | bc) +echo "Size: ${ARCHIVE_SIZE_MB} MB" +echo "" + +# ============================================================================ +# [3/16] Check tar +# ============================================================================ +echo -e "${YELLOW}==[3/16] Check tar ==${NC}" + +if ! command -v tar &>/dev/null; then + echo -e "${RED}ERROR: tar not found${NC}" + exit 1 +fi +echo -e "${GREEN}[OK] tar found${NC}" +echo "" + +# ============================================================================ +# [4/16] Extract Archive +# ============================================================================ +echo -e "${YELLOW}==[4/16] Extract Archive ==${NC}" +echo -e "${GRAY}[INFO] Extracting...${NC}" + +tar -xzf "$ARCHIVE" -C "$START_DIR" +if [ $? -ne 0 ]; then + echo -e "${RED}ERROR: Extraction failed${NC}" + exit 1 +fi +echo -e "${GREEN}[OK] Extracted${NC}" +echo "" + +# ============================================================================ +# [5/16] Set Permissions +# ============================================================================ +echo -e "${YELLOW}==[5/16] Set Permissions ==${NC}" + +chmod -R u+rw "$START_DIR" 2>/dev/null || true +echo -e "${GREEN}[OK] Permissions set${NC}" +echo "" + +# ============================================================================ +# [6/16] Find Project Root +# ============================================================================ +echo -e "${YELLOW}==[6/16] Find Project Root ==${NC}" + +GRADLEW=$(find "$START_DIR" -name "gradlew" -type f 2>/dev/null | sort | head -1) +if [ -z "$GRADLEW" ]; then + echo -e "${RED}ERROR: gradlew not found${NC}" + exit 1 +fi + +PROJECT_DIR=$(dirname "$GRADLEW") +echo -e "${CYAN}Project: $PROJECT_DIR${NC}" +cd "$PROJECT_DIR" +echo "" + +# ============================================================================ +# [7/16] Fix Permissions +# ============================================================================ +echo -e "${YELLOW}==[7/16] Fix Permissions ==${NC}" + +chmod +x ./gradlew +find . -name "*.sh" -type f -exec chmod +x {} \; 2>/dev/null || true +echo -e "${GREEN}[OK] Permissions fixed${NC}" +echo "" + +# ============================================================================ +# [8/16] Verify Wrapper +# ============================================================================ +echo -e "${YELLOW}==[8/16] Verify Wrapper ==${NC}" + +WRAPPER_DIR="$PROJECT_DIR/gradle/wrapper" +WRAPPER_JAR="$WRAPPER_DIR/gradle-wrapper.jar" +WRAPPER_PROP="$WRAPPER_DIR/gradle-wrapper.properties" + +if [ ! -f "$WRAPPER_PROP" ]; then + echo -e "${RED}ERROR: gradle-wrapper.properties missing${NC}" + exit 1 +fi + +if [ ! -f "$WRAPPER_JAR" ]; then + SEED_JAR="$PROJECT_DIR/$WRAPPER_SEED_PATH/gradle-wrapper.jar" + if [ -f "$SEED_JAR" ]; then + mkdir -p "$WRAPPER_DIR" + cp "$SEED_JAR" "$WRAPPER_JAR" + echo -e "${GREEN}[OK] Injected from seed${NC}" + else + echo -e "${RED}ERROR: wrapper jar missing${NC}" + exit 1 + fi +else + echo -e "${GREEN}[OK] Wrapper verified${NC}" +fi +echo "" + +# ============================================================================ +# [9/16] Set GRADLE_USER_HOME +# ============================================================================ +echo -e "${YELLOW}==[9/16] Set GRADLE_USER_HOME ==${NC}" + +OFFLINE_HOME="$PROJECT_DIR/$OFFLINE_HOME_NAME" +if [ ! -d "$OFFLINE_HOME" ]; then + echo -e "${RED}ERROR: _offline_gradle_home not found in archive${NC}" + exit 1 +fi + +export GRADLE_USER_HOME="$OFFLINE_HOME" +echo -e "${CYAN}GRADLE_USER_HOME = $GRADLE_USER_HOME${NC}" + +# Check cache +CACHES_DIR="$OFFLINE_HOME/caches" +if [ -d "$CACHES_DIR" ]; then + CACHE_SIZE=$(du -sb "$CACHES_DIR" 2>/dev/null | cut -f1) + CACHE_SIZE_MB=$(echo "scale=2; $CACHE_SIZE / 1048576" | bc) + echo -e "${CYAN}[INFO] Cache size: ${CACHE_SIZE_MB} MB${NC}" +else + echo -e "${YELLOW}[WARN] No cache folder found${NC}" +fi +echo "" + +# ============================================================================ +# [10/16] Verify settings.gradle +# ============================================================================ +echo -e "${YELLOW}==[10/16] Verify settings.gradle ==${NC}" + +SETTINGS_FILE="" +if [ -f "./settings.gradle" ]; then + SETTINGS_FILE="settings.gradle" +elif [ -f "./settings.gradle.kts" ]; then + SETTINGS_FILE="settings.gradle.kts" +fi + +if [ -n "$SETTINGS_FILE" ]; then + if grep -q "mavenLocal()" "$SETTINGS_FILE" && grep -q "pluginManagement" "$SETTINGS_FILE"; then + echo -e "${GREEN}[OK] settings.gradle configured for offline${NC}" + else + echo -e "${YELLOW}[WARN] settings.gradle may not be configured for offline${NC}" + echo -e "${GRAY}[INFO] Build may fail if plugins not cached${NC}" + fi +fi +echo "" + +# ============================================================================ +# [11/16] Test Gradle +# ============================================================================ +echo -e "${YELLOW}==[11/16] Test Gradle ==${NC}" + +GRADLE_WORKS=false +if ./gradlew --offline --version &>/dev/null; then + GRADLE_WORKS=true + echo -e "${GREEN}[OK] Gradle working in offline mode${NC}" +else + echo -e "${YELLOW}[WARN] Gradle --version failed${NC}" +fi +echo "" + +# ============================================================================ +# [12/16] Stop Daemon +# ============================================================================ +echo -e "${YELLOW}==[12/16] Stop Daemon ==${NC}" + +./gradlew --stop &>/dev/null || true +sleep 2 +echo -e "${GREEN}[OK] Daemon stopped${NC}" +echo "" + +# ============================================================================ +# [13/16] Run Offline Build +# ============================================================================ +echo -e "${YELLOW}==[13/16] Run Offline Build ==${NC}" +echo "" +echo -e "${CYAN}============================================================${NC}" +echo -e "${CYAN} Building with --offline flag${NC}" +echo -e "${CYAN} All dependencies from local cache${NC}" +echo -e "${CYAN}============================================================${NC}" +echo "" + +BUILD_SUCCESS=false +BUILD_TASK="" + +# Try bootJar +echo -e "${GRAY}[TRY] --offline bootJar...${NC}" +if ./gradlew --offline clean bootJar --no-daemon; then + BUILD_SUCCESS=true + BUILD_TASK="bootJar" +fi + +# Try jar +if [ "$BUILD_SUCCESS" = false ]; then + echo -e "${GRAY}[TRY] --offline jar...${NC}" + if ./gradlew --offline clean jar --no-daemon; then + BUILD_SUCCESS=true + BUILD_TASK="jar" + fi +fi + +# Try build +if [ "$BUILD_SUCCESS" = false ]; then + echo -e "${GRAY}[TRY] --offline build...${NC}" + if ./gradlew --offline build --no-daemon; then + BUILD_SUCCESS=true + BUILD_TASK="build" + fi +fi + +echo "" +if [ "$BUILD_SUCCESS" = true ]; then + echo -e "${GREEN}============================================================${NC}" + echo -e "${GREEN} BUILD SUCCESS! (task: $BUILD_TASK)${NC}" + echo -e "${GREEN}============================================================${NC}" +else + echo -e "${RED}============================================================${NC}" + echo -e "${RED} BUILD FAILED!${NC}" + echo -e "${RED}============================================================${NC}" + echo "" + echo -e "${YELLOW}Possible causes:${NC}" + echo -e "${WHITE} - Dependencies not in cache${NC}" + echo -e "${WHITE} - Plugin resolution failed${NC}" + echo -e "${WHITE} - Need complete build in online env first${NC}" + exit 1 +fi +echo "" + +# ============================================================================ +# [14/16] Show Build Output +# ============================================================================ +echo -e "${YELLOW}==[14/16] Build Output ==${NC}" + +LIBS_DIR="$PROJECT_DIR/build/libs" +if [ -d "$LIBS_DIR" ]; then + echo -e "${CYAN}build/libs contents:${NC}" + ls -lh "$LIBS_DIR"/*.jar 2>/dev/null | awk '{printf " %-40s %10s\n", $9, $5}' + + MAIN_JAR=$(find "$LIBS_DIR" -name "*.jar" -type f ! -name "*-plain.jar" ! -name "*-sources.jar" ! -name "*-javadoc.jar" 2>/dev/null | head -1) +else + echo -e "${YELLOW}[WARN] build/libs not found${NC}" +fi +echo "" + +# ============================================================================ +# [15/16] Run Instructions +# ============================================================================ +echo -e "${YELLOW}==[15/16] Run Instructions ==${NC}" +echo "" + +if [ -n "$MAIN_JAR" ]; then + echo -e "${CYAN}To run the application:${NC}" + echo -e "${WHITE} java -jar $(basename "$MAIN_JAR")${NC}" + echo "" +fi + +echo -e "${CYAN}To rebuild:${NC}" +echo -e "${WHITE} export GRADLE_USER_HOME=\"./_offline_gradle_home\"${NC}" +echo -e "${WHITE} ./gradlew --offline bootJar --no-daemon${NC}" +echo "" + +# ============================================================================ +# [16/16] Complete +# ============================================================================ +echo -e "${GREEN}============================================================${NC}" +echo -e "${GREEN} Offline Build Complete!${NC}" +echo -e "${GREEN}============================================================${NC}" +echo "" +echo -e "${CYAN}Project: $PROJECT_DIR${NC}" +echo "" diff --git a/src/main/java/com/kamco/cd/kamcoback/Innopam/InnopamApiController.java b/src/main/java/com/kamco/cd/kamcoback/Innopam/InnopamApiController.java index e266552e..cf4d49eb 100644 --- a/src/main/java/com/kamco/cd/kamcoback/Innopam/InnopamApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/Innopam/InnopamApiController.java @@ -1,13 +1,13 @@ package com.kamco.cd.kamcoback.Innopam; -import com.kamco.cd.kamcoback.Innopam.dto.DetectMastDto; +import com.kamco.cd.kamcoback.Innopam.dto.ChngDetectMastDto; +import com.kamco.cd.kamcoback.Innopam.dto.ChngDetectMastDto.ChnDetectMastReqDto; +import com.kamco.cd.kamcoback.Innopam.dto.ChngDetectMastDto.ChngDetectMastSearchDto; +import com.kamco.cd.kamcoback.Innopam.dto.ChngDetectMastDto.ResReturn; import com.kamco.cd.kamcoback.Innopam.dto.DetectMastDto.Basic; import com.kamco.cd.kamcoback.Innopam.dto.DetectMastDto.DetectMastReq; -import com.kamco.cd.kamcoback.Innopam.dto.DetectMastDto.DetectMastSearch; -import com.kamco.cd.kamcoback.Innopam.dto.DetectMastDto.FeaturePnuDto; -import com.kamco.cd.kamcoback.Innopam.service.DetectMastService; +import com.kamco.cd.kamcoback.Innopam.service.InnopamApiService; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -15,24 +15,21 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import java.util.List; -import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -@Tag(name = "이노펨 mockup API", description = "이노펨 mockup API") +@Tag(name = "이노펨 연동 API", description = "이노펨 연동 API") @RestController @RequiredArgsConstructor -@RequestMapping("/api/kcd/cdi/detect") +@RequestMapping("/api/innopam/") public class InnopamApiController { - private final DetectMastService detectMastService; + private final InnopamApiService innopamApiService; /** 탐지결과 등록 */ @Operation(summary = "탐지결과 등록", description = "탐지결과 등록") @@ -49,10 +46,10 @@ public class InnopamApiController { @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) @PostMapping("/mast/regist") - public DetectMastReq setChangeDetection( - @RequestBody @Valid DetectMastDto.DetectMastReq detectMast) { - detectMastService.saveDetectMast(detectMast); - return detectMast; + public ChngDetectMastDto.Basic regist( + @RequestBody @Valid ChngDetectMastDto.ChnDetectMastReqDto chnDetectMastReq) { + // innopamApiService.saveDetectMast(chnDetectMastReq); + return innopamApiService.regist(chnDetectMastReq); } @Operation(summary = "탐지결과 삭제", description = "탐지결과 삭제") @@ -64,13 +61,14 @@ public class InnopamApiController { content = @Content( mediaType = "application/json", - schema = @Schema(implementation = DetectMastReq.class))), + schema = @Schema(implementation = ChnDetectMastReqDto.class))), @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) @PostMapping("/mast/remove") - public String deleteChangeDetection(@RequestBody DetectMastReq detectMast) { - return "OK"; + public ResReturn remove( + @RequestBody @Valid ChngDetectMastDto.ChnDetectMastReqDto chnDetectMastReq) { + return innopamApiService.remove(chnDetectMastReq); } @Operation(summary = "탐지결과 등록목록 조회", description = "탐지결과 등록목록 조회") @@ -87,104 +85,16 @@ public class InnopamApiController { @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) - public List selectChangeDetectionList( - @RequestParam(required = false) String cprsBfYr, - @RequestParam(required = false) String cprsAdYr, - @RequestParam(required = false) Integer dtctSno) { - DetectMastSearch detectMastSearch = new DetectMastSearch(); - detectMastSearch.setCprsAdYr(cprsAdYr); - detectMastSearch.setCprsBfYr(cprsBfYr); - detectMastSearch.setDtctSno(dtctSno); - return detectMastService.selectDetectMast(detectMastSearch); - } - - @Operation(summary = "탐지결과 등록목록 상세 조회", description = "탐지결과 등록목록 상세 조회") - @ApiResponses( - value = { - @ApiResponse( - responseCode = "200", - description = "목록 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = Basic.class))), - @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) - @GetMapping("/mast/list/{dtctMstId}") - public Basic selectChangeDetectionDetail(@PathVariable Long dtctMstId) { - return detectMastService.selectDetectMast(dtctMstId); - } - - @Operation(summary = "탐지객체 랜덤 PNU 리스트 조회", description = "탐지객체 PNU 랜덤값을 생성해서 보여준다") - @ApiResponses( - value = { - @ApiResponse( - responseCode = "200", - description = "목록 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = FeaturePnuDto.class))), - @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) - @GetMapping("/pnu/{cprsBfYr}/{cprsAfYr}/{dtctSno}") - public List selectPnuList( - @PathVariable String cprsBfYr, @PathVariable String cprsAfYr, @PathVariable Integer dtctSno) { - DetectMastSearch detectMastSearch = new DetectMastSearch(); - detectMastSearch.setCprsAdYr(cprsAfYr); - detectMastSearch.setCprsBfYr(cprsBfYr); - detectMastSearch.setDtctSno(dtctSno); - return detectMastService.findPnuData(detectMastSearch); - } - - @Operation(summary = "탐지객체 랜덤 PNU 상세 조회", description = "탐지객체 PNU 랜덤값을 생성해서 보여준다") - @ApiResponses( - value = { - @ApiResponse( - responseCode = "200", - description = "목록 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = FeaturePnuDto.class))), - @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) - @GetMapping("/pnu/{cprsBfYr}/{cprsAfYr}/{dtctSno}/{featureId}") - public FeaturePnuDto selectPnuDetail( - @Parameter(description = "이전년도", example = "2022") @PathVariable String cprsBfYr, - @Parameter(description = "기준년도", example = "2024") @PathVariable String cprsAfYr, - @Parameter(description = "회차", example = "4") @PathVariable Integer dtctSno, - @Parameter(description = "featureId", example = "000e161b-1955-4c89-ad87-0b3b4a91d00f") - @PathVariable - UUID featureId) { - return detectMastService.selectPnuDetail(featureId); - } - - @Operation( - summary = "탐지객체 랜덤 PNU GEOM 업데이트(이노펨에 없는 API)", - description = "탐지객체 랜덤 PNU GEOM 업데이트(이노펨에 없는 API)") - @ApiResponses( - value = { - @ApiResponse( - responseCode = "201", - description = "pnu 업데이트 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = Integer.class))), - @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) - @PutMapping("/pnu/{cprsBfYr}/{cprsAfYr}/{dtctSno}") - public Integer updatePnuList( - @PathVariable String cprsBfYr, @PathVariable String cprsAfYr, @PathVariable Integer dtctSno) { - DetectMastSearch detectMastSearch = new DetectMastSearch(); - detectMastSearch.setCprsAdYr(cprsAfYr); - detectMastSearch.setCprsBfYr(cprsBfYr); - detectMastSearch.setDtctSno(dtctSno); - return detectMastService.updatePnuData(detectMastSearch); + public List selectChangeDetectionList( + @RequestParam(required = false) String chnDtctId, + @RequestParam(required = false) String cprsYr, + @RequestParam(required = false) String crtrYr, + @RequestParam(required = false) String chnDtctSno) { + ChngDetectMastSearchDto searchDto = new ChngDetectMastSearchDto(); + searchDto.setChnDtctId(chnDtctId); + searchDto.setCprsYr(cprsYr); + searchDto.setCrtrYr(crtrYr); + searchDto.setChnDtctSno(chnDtctSno); + return innopamApiService.list(searchDto); } } diff --git a/src/main/java/com/kamco/cd/kamcoback/Innopam/dto/ChngDetectMastDto.java b/src/main/java/com/kamco/cd/kamcoback/Innopam/dto/ChngDetectMastDto.java new file mode 100644 index 00000000..27524c20 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/Innopam/dto/ChngDetectMastDto.java @@ -0,0 +1,146 @@ +package com.kamco.cd.kamcoback.Innopam.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 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 { + private String cprsYr; // 비교년도 2023 + private String crtrYr; // 기준년도 2024 + private String chnDtctSno; // 차수 (1 | 2 | ...) + private String chnDtctId; // 탐지아이디. UUID를 기반으로 '-'를 제거하고 대문자/숫자로 구성 + private String pathNm; // 탐지결과 절대경로명 /kamco_nas/export/{chnDtctId} + private String reqEpno; // 사원번호 + 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; + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/Innopam/service/InnopamApiService.java b/src/main/java/com/kamco/cd/kamcoback/Innopam/service/InnopamApiService.java new file mode 100644 index 00000000..3b38ebc8 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/Innopam/service/InnopamApiService.java @@ -0,0 +1,100 @@ +package com.kamco.cd.kamcoback.Innopam.service; + +import com.fasterxml.jackson.core.JsonFactory; +import com.kamco.cd.kamcoback.Innopam.dto.ChngDetectMastDto; +import com.kamco.cd.kamcoback.Innopam.dto.ChngDetectMastDto.ResReturn; +import com.kamco.cd.kamcoback.Innopam.postgres.core.DetectMastCoreService; +import com.kamco.cd.kamcoback.common.utils.NetUtils; +import com.kamco.cd.kamcoback.common.utils.UserUtil; +import com.kamco.cd.kamcoback.config.resttemplate.ExternalHttpClient; +import com.kamco.cd.kamcoback.config.resttemplate.ExternalHttpClient.ExternalCallResult; +import java.util.ArrayList; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class InnopamApiService { + + @Value("${spring.profiles.active:local}") + private String profile; + + @Value("${innopam.url}") + private String innopamUrl; + + @Value("${innopam.mast}") + private String innopamMastUrl; + + private final DetectMastCoreService detectMastCoreService; + + private final ExternalHttpClient externalHttpClient; + private final UserUtil userUtil = new UserUtil(); + private final NetUtils netUtils = new NetUtils(); + + private final JsonFactory jsonFactory = new JsonFactory(); + + @Transactional + public ChngDetectMastDto.Basic regist(ChngDetectMastDto.ChnDetectMastReqDto chnDetectMastReq) { + + ChngDetectMastDto.Basic basic = new ChngDetectMastDto.Basic(); + + String url = innopamMastUrl + "/regist"; + // url = "http://localhost:8080/api/kcd/cdi/detect/mast/regist"; + + String myip = netUtils.getLocalIP(); + chnDetectMastReq.setReqIp(myip); + + System.out.println("url == " + url); + System.out.println("url == " + myip); + + ExternalCallResult result = + externalHttpClient.call( + url, HttpMethod.POST, chnDetectMastReq, netUtils.jsonHeaders(), String.class); + + System.out.println("result == " + result); + + return basic; + } + + @Transactional + public ResReturn remove(ChngDetectMastDto.ChnDetectMastReqDto chnDetectMastReq) { + ChngDetectMastDto.Basic basic = new ChngDetectMastDto.Basic(); + + String url = innopamMastUrl + "/remove"; + // url = "http://localhost:8080/api/kcd/cdi/detect/mast/remove"; + + String myip = netUtils.getLocalIP(); + chnDetectMastReq.setReqIp(myip); + + System.out.println("url == " + url); + System.out.println("url == " + myip); + + ExternalCallResult result = + externalHttpClient.call( + url, HttpMethod.POST, chnDetectMastReq, netUtils.jsonHeaders(), String.class); + + System.out.println("result == " + result); + + return new ResReturn("success", "탐지결과 삭제 되었습니다."); + } + + @Transactional + public List list(ChngDetectMastDto.ChngDetectMastSearchDto searchDto) { + List masterList = new ArrayList<>(); + + String queryString = netUtils.dtoToQueryString(searchDto, null); + String url = innopamMastUrl + queryString; + + ExternalCallResult result = + externalHttpClient.call(url, HttpMethod.GET, null, netUtils.jsonHeaders(), String.class); + + System.out.println("list result == " + result); + + return masterList; + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/common/enums/ImageryFitStatus.java b/src/main/java/com/kamco/cd/kamcoback/common/enums/ImageryFitStatus.java index c5f3aa20..ad7df5a3 100644 --- a/src/main/java/com/kamco/cd/kamcoback/common/enums/ImageryFitStatus.java +++ b/src/main/java/com/kamco/cd/kamcoback/common/enums/ImageryFitStatus.java @@ -2,6 +2,7 @@ package com.kamco.cd.kamcoback.common.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; @@ -23,4 +24,20 @@ public enum ImageryFitStatus implements EnumType { 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/src/main/java/com/kamco/cd/kamcoback/common/utils/NetUtils.java b/src/main/java/com/kamco/cd/kamcoback/common/utils/NetUtils.java new file mode 100644 index 00000000..ce74d280 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/common/utils/NetUtils.java @@ -0,0 +1,64 @@ +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.List; +import java.util.Map; +import java.util.stream.Collectors; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; + +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.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(List.of(MediaType.APPLICATION_JSON)); + + return headers; + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java b/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java index 2c977bef..9e2c9abc 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultApiController.java @@ -168,9 +168,9 @@ public class InferenceResultApiController { @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) @DeleteMapping("/end") - public ApiResponseDto getInferenceGeomList() { - inferenceResultService.deleteInferenceEnd(); - return ApiResponseDto.ok(null); + public ApiResponseDto getInferenceGeomList() { + UUID uuid = inferenceResultService.deleteInferenceEnd(); + return ApiResponseDto.ok(uuid); } @Operation(summary = "분석 모델 선택 조회", description = "변화탐지 실행 정보 입력 모델선택 팝업 ") @@ -204,80 +204,6 @@ public class InferenceResultApiController { return ApiResponseDto.ok(result); } - // @ApiResponses( - // value = { - // @ApiResponse( - // responseCode = "200", - // description = "검색 성공", - // content = - // @Content( - // mediaType = "application/json", - // schema = @Schema(implementation = InferenceDetailDto.AnalResSummary.class))), - // @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content), - // @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - // }) - // @GetMapping("/summary/{id}") - // public ApiResponseDto getInferenceResultSummary( - // @Parameter(description = "목록 id", example = "53") @PathVariable Long id) { - // return ApiResponseDto.ok(inferenceResultService.getInferenceResultSummary(id)); - // } - // - // @Operation(summary = "추론관리 분석결과 상세", description = "분석결과 상제 정보 Summary, DashBoard") - // @ApiResponses( - // value = { - // @ApiResponse( - // responseCode = "200", - // description = "검색 성공", - // content = - // @Content( - // mediaType = "application/json", - // schema = @Schema(implementation = InferenceDetailDto.Detail.class))), - // @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content), - // @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - // }) - // @GetMapping("/detail/{id}") - // public ApiResponseDto getInferenceDetail( - // @Parameter(description = "목록 id", example = "53") @PathVariable Long id) { - // return ApiResponseDto.ok(inferenceResultService.getDetail(id)); - // } - // - // @Operation(summary = "추론관리 분석결과 상세 목록", description = "추론관리 분석결과 상세 목록 geojson 데이터 조회") - // @ApiResponses( - // value = { - // @ApiResponse( - // responseCode = "200", - // description = "검색 성공", - // content = - // @Content( - // mediaType = "application/json", - // schema = @Schema(implementation = Page.class))), - // @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content), - // @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - // }) - // @GetMapping("/geom/{id}") - // public ApiResponseDto> getInferenceResultGeomList( - // @Parameter(description = "분석결과 id", example = "53") @PathVariable Long id, - // @Parameter(description = "기준년도 분류", example = "land") @RequestParam(required = false) - // String targetClass, - // @Parameter(description = "비교년도 분류", example = "waste") @RequestParam(required = false) - // String compareClass, - // @Parameter(description = "5000:1 도협번호 37801011,37801012") @RequestParam(required = false) - // List mapSheetNum, - // @Parameter(description = "페이지 번호 (0부터 시작)", example = "0") @RequestParam(defaultValue = "0") - // int page, - // @Parameter(description = "페이지 크기", example = "20") @RequestParam(defaultValue = "20") - // int size, - // @Parameter(description = "정렬 조건 (형식: 필드명,방향)", example = "name,asc") - // @RequestParam(required = false) - // String sort) { - // InferenceDetailDto.SearchGeoReq searchGeoReq = - // new InferenceDetailDto.SearchGeoReq( - // targetClass, compareClass, mapSheetNum, page, size, sort); - // Page geomList = - // inferenceResultService.getInferenceResultGeomList(id, searchGeoReq); - // return ApiResponseDto.ok(geomList); - // } - @Operation(summary = "추론관리 추론진행 서버 현황", description = "추론관리 추론진행 서버 현황") @ApiResponses( value = { diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultShpApiController.java b/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultShpApiController.java index d5b4cfbb..c4fa7307 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultShpApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/InferenceResultShpApiController.java @@ -2,6 +2,7 @@ package com.kamco.cd.kamcoback.inference; import com.kamco.cd.kamcoback.config.api.ApiResponseDto; import com.kamco.cd.kamcoback.inference.dto.InferenceResultShpDto; +import com.kamco.cd.kamcoback.inference.dto.InferenceResultShpDto.CreateShpRequest; import com.kamco.cd.kamcoback.inference.service.InferenceResultShpService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -12,8 +13,8 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @Tag(name = "추론결과 데이터 생성", description = "추론결과 데이터 생성 API") @@ -47,11 +48,8 @@ public class InferenceResultShpApiController { @Operation(summary = "추론결과 shp 생성", description = "추론결과 shp 생성") @PostMapping("/shp/{uid}") public ApiResponseDto createShp( - @PathVariable String uid, - @RequestParam Long m1BatchId, - @RequestParam Long m2BatchId, - @RequestParam Long m3BatchId) { - inferenceResultShpService.createShp(uid, m1BatchId, m2BatchId, m3BatchId); + @PathVariable String uid, @RequestBody CreateShpRequest req) { + inferenceResultShpService.createShp(uid, req); return ApiResponseDto.createOK(null); } } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java index 4f4f4413..51dbeb03 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceDetailDto.java @@ -2,7 +2,9 @@ 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.kamco.cd.kamcoback.common.enums.DetectionClassification; +import com.kamco.cd.kamcoback.common.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; @@ -306,7 +308,17 @@ public class InferenceDetailDto { String mapSheetName; String subUid; String pnu; - String passYn; + String fitState; + + @JsonProperty("fitState") + public String getFitState() { + return this.fitState == null ? null : this.fitState; + } + + @JsonProperty("fitStateName") + public String fitStateName() { + return ImageryFitStatus.getDescByCode(this.fitState); + } // @JsonIgnore String gemoStr; // @JsonIgnore String geomCenterStr; @@ -327,7 +339,7 @@ public class InferenceDetailDto { String mapSheetName, String subUid, String pnu, - String passYn) { + String fitState) { this.uuid = uuid; this.uid = uid; this.compareYyyy = compareYyyy; @@ -343,7 +355,7 @@ public class InferenceDetailDto { this.mapSheetName = mapSheetName; this.subUid = subUid; this.pnu = pnu; - this.passYn = passYn; + this.fitState = fitState; } } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java index 00818101..657c5132 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultDto.java @@ -538,20 +538,24 @@ public class InferenceResultDto { 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 enumId = "SAFETY"; - // if( this.cpu_user+this.cpu_system >= 80 )enumId = "CAUTION"; - return ServerStatus.SAFETY.getText(); + 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; } @@ -560,6 +564,8 @@ public class InferenceResultDto { String enumId = "SAFETY"; if (this.gpuUtil >= 80) { enumId = "CAUTION"; + } else if (this.cpu_user + this.cpu_system == 0) { + enumId = "FAILUR"; } return enumId; } @@ -568,6 +574,8 @@ public class InferenceResultDto { String enumId = "SAFETY"; if (this.memused >= 80) { enumId = "CAUTION"; + } else if (this.cpu_user + this.cpu_system + this.memused == 0) { + enumId = "FAILUR"; } return enumId; } @@ -575,6 +583,8 @@ public class InferenceResultDto { 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(); } @@ -582,6 +592,8 @@ public class InferenceResultDto { 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(); } @@ -589,6 +601,8 @@ public class InferenceResultDto { 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(); } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultShpDto.java b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultShpDto.java index 566699dc..20e0ac05 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultShpDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/dto/InferenceResultShpDto.java @@ -102,4 +102,12 @@ public class InferenceResultShpDto { @Schema(description = "geojson 파일 생성 수 (덮어쓰기 포함)", example = "120") private int geojson; } + + @Getter + public static class CreateShpRequest { + + private Long m1BatchId; + private Long m2BatchId; + private Long m3BatchId; + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java index d6bef76f..49709195 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultService.java @@ -41,6 +41,7 @@ import jakarta.validation.constraints.NotNull; import java.nio.file.Path; import java.time.ZonedDateTime; import java.util.ArrayList; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -514,7 +515,52 @@ public class InferenceResultService { } public List getInferenceServerStatusList() { - return inferenceResultCoreService.getInferenceServerStatusList(); + + List dtoList = + inferenceResultCoreService.getInferenceServerStatusList(); + int size = dtoList.size(); + + System.out.println("size =" + size); + + if (size == 0) { + for (int k = 1; k <= 4; k++) { + InferenceServerStatusDto dto = new InferenceServerStatusDto(); + dto.setServerName("server0" + k); + dto.setCpu_user(0); + dto.setCpu_system(0); + dto.setMemused(0); + dto.setKbmemused(0L); + dto.setGpuUtil(0); + + dtoList.add(dto); + } + } else { + for (int k = 1; k <= 4; k++) { + String srvNm = "server" + k; + String srvNmChk = "N"; + for (InferenceServerStatusDto dto : dtoList) { + if (srvNm.equals(dto.getServerName())) { + srvNmChk = "Y"; + break; + } + } + + if (srvNmChk.equals("N")) { + InferenceServerStatusDto dto = new InferenceServerStatusDto(); + dto.setServerName(srvNm); + dto.setCpu_user(0); + dto.setCpu_system(0); + dto.setMemused(0); + dto.setKbmemused(0L); + dto.setGpuUtil(0); + dtoList.add(dto); + } + } + } + + dtoList.sort(Comparator.comparing(InferenceServerStatusDto::getServerName)); + + return dtoList; } /** @@ -542,7 +588,7 @@ public class InferenceResultService { /** 추론 종료 */ @Transactional - public void deleteInferenceEnd() { + public UUID deleteInferenceEnd() { SaveInferenceAiDto dto = inferenceResultCoreService.getProcessing(); if (dto == null) { throw new CustomApiException("NOT_FOUND", HttpStatus.NOT_FOUND); @@ -571,6 +617,7 @@ public class InferenceResultService { // upsertGeomData Long learnId = inferenceResultCoreService.getInferenceLearnIdByUuid(dto.getUuid()); inferenceResultCoreService.upsertGeomData(learnId); + return dto.getUuid(); } /** diff --git a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultShpService.java b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultShpService.java index db8c4b78..d6a2a1c7 100644 --- a/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultShpService.java +++ b/src/main/java/com/kamco/cd/kamcoback/inference/service/InferenceResultShpService.java @@ -1,6 +1,7 @@ package com.kamco.cd.kamcoback.inference.service; import com.kamco.cd.kamcoback.inference.dto.InferenceResultShpDto; +import com.kamco.cd.kamcoback.inference.dto.InferenceResultShpDto.CreateShpRequest; import com.kamco.cd.kamcoback.inference.dto.InferenceResultsTestingDto; import com.kamco.cd.kamcoback.postgres.core.InferenceResultCoreService; import com.kamco.cd.kamcoback.postgres.core.InferenceResultShpCoreService; @@ -36,11 +37,17 @@ public class InferenceResultShpService { return coreService.buildInferenceData(id); } - public void createShp(String uid, Long m1BatchId, Long m2BatchId, Long m3BatchId) { + /** + * shp 파일 수동생성 + * + * @param uid + * @param req + */ + public void createShp(String uid, CreateShpRequest req) { List batchIds = new ArrayList<>(); - batchIds.add(m1BatchId); - batchIds.add(m2BatchId); - batchIds.add(m3BatchId); + batchIds.add(req.getM1BatchId()); + batchIds.add(req.getM2BatchId()); + batchIds.add(req.getM3BatchId()); List resultList = inferenceResultCoreService.getInferenceResults(batchIds); @@ -58,7 +65,7 @@ public class InferenceResultShpService { } inferenceId = uid; String mapIds = sb.toString(); - String batchId = m1BatchId + "," + m2BatchId + "," + m3BatchId; + String batchId = req.getM1BatchId() + "," + req.getM2BatchId() + "," + req.getM3BatchId(); // shp 파일 비동기 생성 shpPipelineService.runPipeline(jarPath, datasetDir, batchId, inferenceId, mapIds); diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.java index c08fee12..203028b8 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MapSheetAnalDataInferenceGeomEntity.java @@ -90,7 +90,6 @@ public class MapSheetAnalDataInferenceGeomEntity { private Long pnu; @Size(max = 20) - @ColumnDefault("'0'") @Column(name = "fit_state", length = 20) private String fitState; @@ -150,12 +149,6 @@ public class MapSheetAnalDataInferenceGeomEntity { @Column(name = "file_created_dttm") private ZonedDateTime fileCreatedDttm; - @Column(name = "pass_yn") - private String passYn; - - @Column(name = "pass_yn_dttm") - private ZonedDateTime passYnDttm; - @Column(name = "result_uid") private String resultUid; diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java index 0c332003..07e78bbc 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/Inference/MapSheetLearnRepositoryImpl.java @@ -121,6 +121,8 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto queryFactory .select(systemMetricEntity.timestamp.max()) .from(systemMetricEntity) + .where(systemMetricEntity.timestamp.goe(OffsetDateTime.now().minusMinutes(5))) + // .where(systemMetricEntity.timestamp.goe(OffsetDateTime.now().minusSeconds(30))) .groupBy(systemMetricEntity.serverName) .fetch(); @@ -128,6 +130,8 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto queryFactory .select(gpuMetricEntity.timestamp.max()) .from(gpuMetricEntity) + .where(gpuMetricEntity.timestamp.goe(OffsetDateTime.now().minusMinutes(5))) + // .where(gpuMetricEntity.timestamp.goe(OffsetDateTime.now().minusSeconds(30))) .groupBy(gpuMetricEntity.serverName) .fetch(); @@ -442,7 +446,7 @@ public class MapSheetLearnRepositoryImpl implements MapSheetLearnRepositoryCusto "substring({0} from 1 for 8)", mapSheetAnalDataInferenceGeomEntity.resultUid), pnu, - Expressions.nullExpression(String.class))) + mapSheetAnalDataInferenceGeomEntity.fitState)) .from(mapSheetAnalInferenceEntity) .join(mapSheetAnalDataInferenceEntity) .on(mapSheetAnalDataInferenceEntity.analUid.eq(mapSheetAnalInferenceEntity.id)) diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index a265ea9d..436f2802 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -106,3 +106,8 @@ inference: batch-url: http://10.100.0.11:8000/batches geojson-dir: /kamco-nfs/requests/ jar-path: /kamco-nfs/dataset/shp_exporter-1.0.0.jar + +innopam: + #url: http://localhost:8080 + url: http://192.168.2.129:5301 + mast : ${innopam.url}/api/kcd/cdi/chn/mast diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index d3eafec4..eacb76ad 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -63,3 +63,7 @@ inference: geojson-dir: /kamco-nfs/requests/ jar-path: /kamco-nfs/dataset/shp_exporter-1.0.0.jar +innopam: + #url: http://localhost:8080 + url: http://192.168.2.129:5301 + mast: ${innopam.url}/api/kcd/cdi/chn/mast