From e6c637e16550437ac0ecd58c79ce62a4fe397fb7 Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Mon, 24 Nov 2025 18:37:09 +0900 Subject: (김준회) dolce: maxSerialNo 못 받는 경우 폴백(1) 추가 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/revisions/max-serial-no/route.ts | 13 +++++-- .../ship-vendor-document/new-revision-dialog.tsx | 41 ++++++++++++++-------- .../user-vendor-document-table-container.tsx | 20 ++++++----- 3 files changed, 48 insertions(+), 26 deletions(-) diff --git a/app/api/revisions/max-serial-no/route.ts b/app/api/revisions/max-serial-no/route.ts index 0681b66d..6cdf18b6 100644 --- a/app/api/revisions/max-serial-no/route.ts +++ b/app/api/revisions/max-serial-no/route.ts @@ -18,8 +18,8 @@ export async function GET(request: NextRequest) { debugLog('1. Input documentId:', documentId) - if (!documentId) { - debugLog('2. documentId is missing, returning 400') + if (!documentId || documentId === 'undefined' || documentId === 'null') { + debugLog('2. documentId is missing or invalid, returning 400') return NextResponse.json( { error: 'documentId is required' }, { status: 400 } @@ -27,6 +27,15 @@ export async function GET(request: NextRequest) { } const parsedDocumentId = parseInt(documentId) + + if (isNaN(parsedDocumentId)) { + debugError('3. Invalid documentId - cannot parse to integer:', documentId) + return NextResponse.json( + { error: 'Invalid documentId format' }, + { status: 400 } + ) + } + debugLog('3. Parsed documentId:', parsedDocumentId) // 1. 내부 DB에서 최대 serialNo 조회 diff --git a/components/ship-vendor-document/new-revision-dialog.tsx b/components/ship-vendor-document/new-revision-dialog.tsx index bdbb1bc6..39025fa4 100644 --- a/components/ship-vendor-document/new-revision-dialog.tsx +++ b/components/ship-vendor-document/new-revision-dialog.tsx @@ -248,6 +248,14 @@ export function NewRevisionDialog({ // Serial No 조회 const fetchNextSerialNo = React.useCallback(async () => { console.log('🔍 fetchNextSerialNo called with documentId:', documentId) + + // documentId 유효성 검사 + if (!documentId || documentId === undefined || documentId === null) { + console.warn('⚠️ Invalid documentId, using default serialNo: 1') + setNextSerialNo("1") + return + } + setIsLoadingSerialNo(true) try { const apiUrl = `/api/revisions/max-serial-no?documentId=${documentId}` @@ -267,11 +275,16 @@ export function NewRevisionDialog({ setNextSerialNo(serialNoString) console.log('🔍 nextSerialNo state updated') } else { - console.error('🔍 API call failed with status:', response.status) + const errorData = await response.json().catch(() => ({})) + console.error('🔍 API call failed with status:', response.status, errorData) + // API 실패 시 기본값 1 사용 + console.warn('⚠️ Using default serialNo: 1') + setNextSerialNo("1") } } catch (error) { console.error('❌ Failed to fetch serial no:', error) // 에러 시 기본값 1 사용 + console.warn('⚠️ Using default serialNo: 1 due to error') setNextSerialNo("1") } finally { setIsLoadingSerialNo(false) @@ -280,12 +293,15 @@ export function NewRevisionDialog({ // Dialog 열릴 때 Serial No 조회 React.useEffect(() => { - console.log('🎯 useEffect triggered - open:', open, 'documentId:', documentId) - if (open && documentId) { - console.log('🎯 Calling fetchNextSerialNo') - fetchNextSerialNo() - } else { - console.log('🎯 Conditions not met for fetchNextSerialNo') + console.log('🎯 useEffect triggered - open:', open, 'documentId:', documentId, 'type:', typeof documentId) + if (open) { + if (documentId && typeof documentId === 'number' && documentId > 0) { + console.log('🎯 Calling fetchNextSerialNo') + fetchNextSerialNo() + } else { + console.warn('🎯 Invalid documentId, using default serialNo: 1') + setNextSerialNo("1") + } } }, [open, documentId, fetchNextSerialNo]) @@ -475,17 +491,12 @@ export function NewRevisionDialog({
Document: {documentTitle}
- Drawing Type: {drawingKind} | Serial No: {nextSerialNo} - {isLoadingSerialNo && ( + Drawing Type: {drawingKind} | Serial No: {isLoadingSerialNo ? ( <> - + Loading... - )} - {/* 디버그용 임시 표시 */} -
- Debug: nextSerialNo={nextSerialNo}, isLoading={isLoadingSerialNo} -
+ ) : nextSerialNo}
)} diff --git a/components/ship-vendor-document/user-vendor-document-table-container.tsx b/components/ship-vendor-document/user-vendor-document-table-container.tsx index 0c3390d1..1670732a 100644 --- a/components/ship-vendor-document/user-vendor-document-table-container.tsx +++ b/components/ship-vendor-document/user-vendor-document-table-container.tsx @@ -833,7 +833,7 @@ function SubTables() { const handleDownloadFile = React.useCallback(async (attachment: AttachmentInfo) => { try { // 파일 경로 처리 - let downloadPath = attachment.filePath + const downloadPath = attachment.filePath // 공용 다운로드 함수 사용 (보안 검증, 파일 체크 모두 포함) const result = await downloadFile(downloadPath, attachment.fileName, { @@ -1240,14 +1240,16 @@ function SubTables() { - + {selectedDocument && ( + + )} {/* ✅ 리비전 수정 다이얼로그 */}