fix: 트랜잭션 오류 해결 및 CORS 오류 수정
- 리비전 업로드 시 InFailedSqlTransaction 오류 해결 - 트랜잭션 롤백 및 새 세션 생성 로직 추가 - 특정 쿼리 실행 전 트랜잭션 롤백 처리 - API URL을 /api로 통일하여 CORS 오류 해결 - J24-001 더미 프로젝트 옵션 완전 제거
This commit is contained in:
@@ -323,6 +323,24 @@ async def upload_file(
|
|||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
current_user: dict = Depends(get_current_user)
|
current_user: dict = Depends(get_current_user)
|
||||||
):
|
):
|
||||||
|
# 🎯 트랜잭션 오류 방지: 완전한 트랜잭션 초기화
|
||||||
|
try:
|
||||||
|
# 1. 현재 트랜잭션 완전 롤백
|
||||||
|
db.rollback()
|
||||||
|
print("🔄 1단계: 이전 트랜잭션 롤백 완료")
|
||||||
|
|
||||||
|
# 2. 세션 상태 초기화
|
||||||
|
db.close()
|
||||||
|
print("🔄 2단계: 세션 닫기 완료")
|
||||||
|
|
||||||
|
# 3. 새 세션 생성
|
||||||
|
from ..database import get_db
|
||||||
|
db = next(get_db())
|
||||||
|
print("🔄 3단계: 새 세션 생성 완료")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"⚠️ 트랜잭션 초기화 중 오류: {e}")
|
||||||
|
# 오류 발생 시에도 계속 진행
|
||||||
# 로그 제거
|
# 로그 제거
|
||||||
if not validate_file_extension(file.filename):
|
if not validate_file_extension(file.filename):
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
@@ -541,13 +559,24 @@ async def upload_file(
|
|||||||
print(f"🔄 리비전 업로드: 전체 {len(materials_to_classify)}개 자재 저장 (변경사항 추적 포함)")
|
print(f"🔄 리비전 업로드: 전체 {len(materials_to_classify)}개 자재 저장 (변경사항 추적 포함)")
|
||||||
|
|
||||||
# 이전 리비전의 자재 조회 (도면번호 기준)
|
# 이전 리비전의 자재 조회 (도면번호 기준)
|
||||||
prev_materials_query = text("""
|
try:
|
||||||
SELECT original_description, size_spec, material_grade, main_nom,
|
# 🎯 트랜잭션 오류 방지: 쿼리 실행 전 롤백
|
||||||
drawing_name, line_no, quantity
|
db.rollback()
|
||||||
FROM materials
|
print("🔄 리비전 자재 조회 전 트랜잭션 롤백")
|
||||||
WHERE file_id = :parent_file_id
|
|
||||||
""")
|
prev_materials_query = text("""
|
||||||
prev_materials_result = db.execute(prev_materials_query, {"parent_file_id": parent_file_id}).fetchall()
|
SELECT original_description, size_spec, material_grade, main_nom,
|
||||||
|
drawing_name, line_no, quantity
|
||||||
|
FROM materials
|
||||||
|
WHERE file_id = :parent_file_id
|
||||||
|
""")
|
||||||
|
prev_materials_result = db.execute(prev_materials_query, {"parent_file_id": parent_file_id}).fetchall()
|
||||||
|
print(f"✅ 이전 리비전 자재 조회 성공: {len(prev_materials_result)}개")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"❌ 이전 리비전 자재 조회 실패: {e}")
|
||||||
|
# 오류 발생 시 빈 결과로 처리
|
||||||
|
prev_materials_result = []
|
||||||
|
|
||||||
# 이전 자재를 딕셔너리로 변환 (도면번호 + 설명 + 크기 + 재질로 키 생성)
|
# 이전 자재를 딕셔너리로 변환 (도면번호 + 설명 + 크기 + 재질로 키 생성)
|
||||||
prev_materials_dict = {}
|
prev_materials_dict = {}
|
||||||
|
|||||||
@@ -649,11 +649,7 @@ function App() {
|
|||||||
</option>
|
</option>
|
||||||
))
|
))
|
||||||
) : (
|
) : (
|
||||||
<>
|
<option value="">프로젝트를 먼저 생성해주세요</option>
|
||||||
<option value="J24-001">J24-001 - 테스트 프로젝트 A</option>
|
|
||||||
<option value="J24-002">J24-002 - 테스트 프로젝트 B</option>
|
|
||||||
<option value="J24-003">J24-003 - 테스트 프로젝트 C</option>
|
|
||||||
</>
|
|
||||||
)}
|
)}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,7 @@ import { logApiError } from './utils/errorLogger';
|
|||||||
|
|
||||||
// 환경변수에서 API URL을 읽음 (Vite 기준)
|
// 환경변수에서 API URL을 읽음 (Vite 기준)
|
||||||
// 프로덕션에서는 nginx 프록시를 통해 /api 경로 사용
|
// 프로덕션에서는 nginx 프록시를 통해 /api 경로 사용
|
||||||
const API_BASE_URL = import.meta.env.VITE_API_URL ||
|
const API_BASE_URL = '/api';
|
||||||
(import.meta.env.DEV ? 'http://localhost:18000' : '/api');
|
|
||||||
|
|
||||||
console.log('API Base URL:', API_BASE_URL);
|
console.log('API Base URL:', API_BASE_URL);
|
||||||
console.log('Environment:', import.meta.env.MODE);
|
console.log('Environment:', import.meta.env.MODE);
|
||||||
|
|||||||
Reference in New Issue
Block a user