diff options
Diffstat (limited to 'app/api/revisions')
| -rw-r--r-- | app/api/revisions/max-serial-no/route.ts | 175 |
1 files changed, 158 insertions, 17 deletions
diff --git a/app/api/revisions/max-serial-no/route.ts b/app/api/revisions/max-serial-no/route.ts index c0bfe5c3..0681b66d 100644 --- a/app/api/revisions/max-serial-no/route.ts +++ b/app/api/revisions/max-serial-no/route.ts @@ -1,10 +1,16 @@ import { NextRequest, NextResponse } from 'next/server' import db from '@/db/db' -import { revisions, issueStages } from '@/db/schema/vendorDocu' +import { revisions, issueStages, documents, projects } from '@/db/schema' import { eq, sql } from 'drizzle-orm' import { alias } from 'drizzle-orm/pg-core' import { debugLog, debugError, debugSuccess } from '@/lib/debug-utils' +// DOLCE Detail Document 타입 정의 +interface DOLCEDetailDocument { + RegisterSerialNoMax?: string | number + // 다른 필드들도 필요시 추가 +} + export async function GET(request: NextRequest) { try { const { searchParams } = new URL(request.url) @@ -23,7 +29,7 @@ export async function GET(request: NextRequest) { const parsedDocumentId = parseInt(documentId) debugLog('3. Parsed documentId:', parsedDocumentId) - // 해당 document의 모든 issueStages와 연결된 revisions에서 최대 serialNo 조회 + // 1. 내부 DB에서 최대 serialNo 조회 const r = alias(revisions, 'r') const is = alias(issueStages, 'is') @@ -45,30 +51,114 @@ export async function GET(request: NextRequest) { ) .where(eq(is.documentId, parsedDocumentId)) - debugLog('5. Query result:', maxSerialResult) - debugLog('6. Query result length:', maxSerialResult.length) - debugLog('7. First result item:', maxSerialResult[0]) + debugLog('5. Internal DB query result:', maxSerialResult) + + const internalMaxSerial = maxSerialResult[0]?.maxSerial || 0 + const internalMaxRegisterSerial = maxSerialResult[0]?.maxRegisterSerial || 0 + const internalMaxSerialNo = Math.max(internalMaxSerial, internalMaxRegisterSerial) + + debugLog('6. Internal maxSerialNo:', internalMaxSerialNo) + + // 2. Document 정보 조회 (DOLCE API 호출을 위해) + const documentInfo = await db + .select({ + docNumber: documents.docNumber, + drawingKind: documents.drawingKind, + discipline: documents.discipline, + projectId: documents.projectId, + projectCode: projects.code + }) + .from(documents) + .leftJoin(projects, eq(documents.projectId, projects.id)) + .where(eq(documents.id, parsedDocumentId)) + .limit(1) + + debugLog('7. Document info:', documentInfo[0]) + + if (!documentInfo[0]) { + debugError('Document not found for id:', parsedDocumentId) + return NextResponse.json( + { error: 'Document not found' }, + { status: 404 } + ) + } + + const { docNumber, drawingKind, discipline, projectCode } = documentInfo[0] + + // 필수 필드 검증 + if (!projectCode || !docNumber || !discipline || !drawingKind) { + debugLog('8. Missing required fields for DOLCE API') + debugLog(' - projectCode:', projectCode) + debugLog(' - docNumber:', docNumber) + debugLog(' - discipline:', discipline) + debugLog(' - drawingKind:', drawingKind) + + // DOLCE API 호출 불가능한 경우, 내부 DB 값만 사용 + return NextResponse.json({ + maxSerialNo: internalMaxSerialNo, + nextSerialNo: internalMaxSerialNo + 1, + documentId: documentId, + source: 'internal_only', + debug: { + parsedDocumentId, + internalMaxSerialNo, + missingFields: { + projectCode: !projectCode, + docNumber: !docNumber, + discipline: !discipline, + drawingKind: !drawingKind + } + } + }) + } + + // 3. DOLCE API 호출 + let dolceMaxSerialNo = 0 + try { + debugLog('9. Calling DOLCE API...') + const dolceDocuments = await fetchDetailFromDOLCE( + projectCode, + docNumber, + discipline, + drawingKind + ) - const maxSerialValue = maxSerialResult[0]?.maxSerial || 0 - const maxRegisterSerialValue = maxSerialResult[0]?.maxRegisterSerial || 0 + debugLog('10. DOLCE API response:', dolceDocuments) - debugLog('8. maxSerial value:', maxSerialValue) - debugLog('9. maxRegisterSerial value:', maxRegisterSerialValue) + if (dolceDocuments && dolceDocuments.length > 0) { + // 첫 번째 문서의 RegisterSerialNoMax 값 사용 + const firstDoc = dolceDocuments[0] + if (firstDoc.RegisterSerialNoMax) { + dolceMaxSerialNo = parseInt(String(firstDoc.RegisterSerialNoMax)) || 0 + debugLog('11. DOLCE maxSerialNo:', dolceMaxSerialNo) + } + } + } catch (error) { + debugError('DOLCE API call failed:', error) + // DOLCE API 실패 시에도 내부 DB 값은 사용 + } - const maxSerialNo = Math.max(maxSerialValue, maxRegisterSerialValue) + // 4. 내부 DB와 DOLCE 값 중 최대값 선택 + const finalMaxSerialNo = Math.max(internalMaxSerialNo, dolceMaxSerialNo) - debugSuccess('10. Final maxSerialNo:', maxSerialNo) - debugSuccess('11. Next serialNo:', maxSerialNo + 1) + debugSuccess('12. Final maxSerialNo:', finalMaxSerialNo) + debugSuccess('13. Next serialNo:', finalMaxSerialNo + 1) return NextResponse.json({ - maxSerialNo, - nextSerialNo: maxSerialNo + 1, + maxSerialNo: finalMaxSerialNo, + nextSerialNo: finalMaxSerialNo + 1, documentId: documentId, + source: dolceMaxSerialNo > internalMaxSerialNo ? 'dolce' : 'internal', debug: { parsedDocumentId, - queryResult: maxSerialResult, - maxSerialValue, - maxRegisterSerialValue + internalMaxSerialNo, + dolceMaxSerialNo, + documentInfo: { + projectCode, + docNumber, + discipline, + drawingKind + } } }) } catch (error) { @@ -79,4 +169,55 @@ export async function GET(request: NextRequest) { { status: 500 } ) } +} + +// DOLCE Detail API 호출 함수 +async function fetchDetailFromDOLCE( + projectCode: string, + drawingNo: string, + discipline: string, + drawingKind: string +): Promise<DOLCEDetailDocument[]> { + const endpoint = process.env.DOLCE_DOC_DETAIL_API_URL || 'http://60.100.99.217:1111/Services/VDCSWebService.svc/DetailDwgReceiptMgmt' + + const requestBody = { + project: projectCode, + drawingNo: drawingNo, + discipline: discipline, + drawingKind: drawingKind + } + + console.log(`Fetching detail from DOLCE: ${projectCode} - ${drawingNo}`) + console.log('Request body:', requestBody) + + try { + const response = await fetch(endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody) + }) + + if (!response.ok) { + const errorText = await response.text() + throw new Error(`DOLCE Detail API failed: HTTP ${response.status} - ${errorText}`) + } + + const data = await response.json() + + // DOLCE Detail API 응답 구조에 맞게 처리 + if (data.DetailDwgReceiptMgmtResult) { + const documents = data.DetailDwgReceiptMgmtResult as DOLCEDetailDocument[] + console.log(`Found ${documents.length} detail records for ${drawingNo}`) + return documents + } else { + console.warn(`Unexpected DOLCE Detail response structure:`, data) + return [] + } + + } catch (error) { + console.error(`DOLCE Detail API call failed for ${drawingNo}:`, error) + throw error + } }
\ No newline at end of file |
