PDO::ERRMODE_EXCEPTION] ); $productCode = $_GET['product_code'] ?? ''; if (!$productCode) { echo json_encode(['status' => 'fail', 'message' => '제품코드 없음']); exit; } // 1️⃣ 현재 제품의 최신 내부/외부 버전 정보 가져오기 // updated_at 기준으로 가장 최신 행 1개만 가져옵니다. $st = $pdo->prepare(" SELECT family_version, external_version FROM deploy_versions WHERE product_code = ? ORDER BY updated_at DESC LIMIT 1 "); $st->execute([$productCode]); $verRow = $st->fetch(PDO::FETCH_ASSOC); // 데이터가 아예 없을 경우를 대비한 기본값 $familyVer = $verRow['family_version'] ?? '0.0.0'; $externalVer = $verRow['external_version'] ?? ''; // 2️⃣ "사용안함" 로직: 내부와 외부 버전이 같으면 외부 버전은 빈 값으로 처리 if ($externalVer === $familyVer) { $externalVer = ''; } // 3️⃣ 콤보박스에 들어갈 '배포 확정'된 버전 목록 가져오기 (deploy_files 테이블 기준) $st = $pdo->prepare(" SELECT DISTINCT sw_version FROM deploy_files WHERE product_code = ? AND release_date IS NOT NULL AND deleted = 0 ORDER BY CAST(SUBSTRING_INDEX(sw_version, '.', 1) AS UNSIGNED) DESC, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(sw_version, '.', 2), '.', -1) AS UNSIGNED) DESC, CAST(SUBSTRING_INDEX(sw_version, '.', -1) AS UNSIGNED) DESC "); $st->execute([$productCode]); $allVersions = $st->fetchAll(PDO::FETCH_COLUMN); // 4️⃣ 필터링 및 "사용안함" 옵션 추가 $filtered = []; foreach ($allVersions as $v) { // 내부 배포 버전(최신 작업물)보다 높은 버전은 목록에서 제외 (논리적 오류 방지) if (version_compare($v, $familyVer, '>')) continue; $filtered[] = $v; } // 목록 최상단에 항상 "사용안함" 추가 array_unshift($filtered, ""); echo json_encode([ 'status' => 'ok', 'family_version' => $familyVer, // 프론트의 #latest-family에 표시됨 'external_version' => $externalVer, // 현재 선택된 값 'external_exists' => ($externalVer !== ''), 'confirmed_versions' => $filtered ]); } catch (Exception $e) { echo json_encode(['status' => 'fail', 'message' => $e->getMessage()]); }