diff options
Diffstat (limited to 'lib/vendor-document-list')
| -rw-r--r-- | lib/vendor-document-list/import-service.ts | 178 |
1 files changed, 152 insertions, 26 deletions
diff --git a/lib/vendor-document-list/import-service.ts b/lib/vendor-document-list/import-service.ts index fb4db85e..a470c2b8 100644 --- a/lib/vendor-document-list/import-service.ts +++ b/lib/vendor-document-list/import-service.ts @@ -2,7 +2,7 @@ import db from "@/db/db" import { documents, issueStages, contracts, projects, vendors, revisions, documentAttachments } from "@/db/schema" -import { eq, and, desc, sql } from "drizzle-orm" +import { eq, and, sql } from "drizzle-orm" import { writeFile, mkdir } from "fs/promises" import { join } from "path" import { v4 as uuidv4 } from "uuid" @@ -38,6 +38,7 @@ export interface ImportStatus { newAttachments: number updatedAttachments: number importEnabled: boolean + error?: string } interface DOLCEDocument { @@ -1015,9 +1016,29 @@ class ImportService { detailDoc: DOLCEDetailDocument, sourceSystem: string ): Promise<'NEW' | 'UPDATED' | 'SKIPPED'> { + + console.log(detailDoc,"detailDoc") // 🆕 여러 조건으로 기존 revision 조회 - let existingRevision = null + type RevisionRecord = { + id: number + issueStageId: number + revision: string + uploaderType: string + uploaderId: number | null + uploaderName: string | null + usage: string | null + usageType: string | null + revisionStatus: string + comment: string | null + externalUploadId: string | null + registerId: string | null + serialNo: string | null + registerSerialNoMax: string | null + createdAt: Date + updatedAt: Date + } + let existingRevision: RevisionRecord | null = null // 1차: registerId로 조회 (가장 정확한 매칭) if (detailDoc.RegisterId) { @@ -1032,7 +1053,9 @@ class ImportService { if (results.length > 0) { existingRevision = results[0] - console.log(`Found revision by registerId: ${detailDoc.RegisterId}`) + console.log(`✅ Found revision by registerId: ${detailDoc.RegisterId} → local ID: ${existingRevision.id}`) + } else { + console.log(`❌ NOT found by registerId: ${detailDoc.RegisterId}`) } } @@ -1049,26 +1072,36 @@ class ImportService { if (results.length > 0) { existingRevision = results[0] - console.log(`Found revision by externalUploadId: ${detailDoc.UploadId}`) + console.log(`✅ Found revision by externalUploadId: ${detailDoc.UploadId} → local ID: ${existingRevision.id}`) + } else { + console.log(`❌ NOT found by externalUploadId: ${detailDoc.UploadId}`) } } - // 3차: DrawingRevNo로 조회 (같은 issueStage 내에서 revision 번호 매칭) - if (!existingRevision && detailDoc.DrawingRevNo) { + // 3차: DrawingRevNo + serialNo로 조회 (같은 issueStage 내에서 정확한 매칭) + if (!existingRevision && detailDoc.DrawingRevNo && detailDoc.RegisterSerialNo) { const results = await db .select() .from(revisions) .where(and( eq(revisions.issueStageId, issueStageId), - eq(revisions.revision, detailDoc.DrawingRevNo) + eq(revisions.revision, detailDoc.DrawingRevNo), + eq(revisions.serialNo, String(detailDoc.RegisterSerialNo)) )) .limit(1) if (results.length > 0) { existingRevision = results[0] - console.log(`Found revision by DrawingRevNo: ${detailDoc.DrawingRevNo}`) + console.log(`✅ Found revision by DrawingRevNo+serialNo: ${detailDoc.DrawingRevNo}/${detailDoc.RegisterSerialNo} → local ID: ${existingRevision.id}`) + } else { + console.log(`❌ NOT found by DrawingRevNo+serialNo: ${detailDoc.DrawingRevNo}/${detailDoc.RegisterSerialNo}`) } } + + // 최종 결과 로그 + if (!existingRevision) { + console.log(`🆕 Will CREATE NEW revision for RegisterId: ${detailDoc.RegisterId} (${detailDoc.DrawingRevNo}/${detailDoc.RegisterSerialNo})`) + } // Category에 따른 uploaderType 매핑 const uploaderType = this.mapCategoryToUploaderType(detailDoc.Category) @@ -1095,21 +1128,17 @@ class ImportService { } if (existingRevision) { - // 업데이트 필요 여부 확인 + // 업데이트 필요 여부 확인 - getImportStatus와 동일한 필드 체크 const hasChanges = - existingRevision.revision !== revisionData.revision || - existingRevision.revisionStatus !== revisionData.revisionStatus || - existingRevision.registerSerialNoMax !== revisionData.registerSerialNoMax || - // existingRevision.uploaderName !== revisionData.uploaderName || - existingRevision.serialNo !== revisionData.serialNo || - existingRevision.registerId !== revisionData.registerId // 🆕 registerId 변경 확인 - + existingRevision.comment !== revisionData.comment || + existingRevision.revisionStatus !== revisionData.revisionStatus + if (hasChanges) { await db .update(revisions) .set(revisionData) .where(eq(revisions.id, existingRevision.id)) - + console.log(`Updated revision: ${detailDoc.RegisterId} (local ID: ${existingRevision.id})`) return 'UPDATED' } else { @@ -1564,18 +1593,94 @@ async getImportStatus( availableRevisions += detailDocs.length for (const detailDoc of detailDocs) { - const existingRevision = await db - .select({ id: revisions.id }) - .from(revisions) - .where(eq(revisions.registerId, detailDoc.RegisterId)) - .limit(1) + // 1. syncSingleRevision과 동일한 방식으로 revision 찾기 + let existingRevision: { id: number; comment: string | null; revisionStatus: string } | null = null + + // 1차: registerId로 조회 (가장 정확한 매칭) + if (detailDoc.RegisterId) { + const results = await db + .select({ + id: revisions.id, + comment: revisions.comment, + revisionStatus: revisions.revisionStatus + }) + .from(revisions) + .where(eq(revisions.registerId, detailDoc.RegisterId)) + .limit(1) + + if (results.length > 0) { + existingRevision = results[0] + } + } + + // 2차: externalUploadId로 조회 (registerId가 없거나 못 찾은 경우) + if (!existingRevision && detailDoc.UploadId) { + const results = await db + .select({ + id: revisions.id, + comment: revisions.comment, + revisionStatus: revisions.revisionStatus + }) + .from(revisions) + .innerJoin(issueStages, eq(issueStages.id, revisions.issueStageId)) + .innerJoin(documents, eq(documents.id, issueStages.documentId)) + .where( + and( + eq(documents.projectId, projectId), + eq(documents.docNumber, detailDoc.DrawingNo), + eq(revisions.externalUploadId, detailDoc.UploadId) + ) + ) + .limit(1) + + if (results.length > 0) { + existingRevision = results[0] + } + } - if (existingRevision.length === 0) { + // 3차: DrawingRevNo + serialNo로 조회 (최후 수단) + if (!existingRevision && detailDoc.DrawingRevNo) { + const results = await db + .select({ + id: revisions.id, + comment: revisions.comment, + revisionStatus: revisions.revisionStatus + }) + .from(revisions) + .innerJoin(issueStages, eq(issueStages.id, revisions.issueStageId)) + .innerJoin(documents, eq(documents.id, issueStages.documentId)) + .where( + and( + eq(documents.projectId, projectId), + eq(documents.docNumber, detailDoc.DrawingNo), + eq(revisions.revision, detailDoc.DrawingRevNo), + eq(revisions.serialNo, String(detailDoc.RegisterSerialNo)) + ) + ) + .limit(1) + + if (results.length > 0) { + existingRevision = results[0] + } + } + + if (!existingRevision) { + // revision이 존재하지 않음 -> 신규 newRevisions++ } else { - updatedRevisions++ + // 2. revision이 존재하면 변경사항이 있는지 체크 + const hasChanges = + existingRevision.comment !== detailDoc.SHINote || + existingRevision.revisionStatus !== detailDoc.Status + + if (hasChanges) { + // 변경사항이 있음 -> 업데이트 대상 + updatedRevisions++ + } + // 변경사항이 없으면 카운트하지 않음 } + // FS Category 문서의 첨부파일 확인 if (detailDoc.Category === 'FS' && detailDoc.UploadId) { try { @@ -1585,16 +1690,37 @@ async getImportStatus( for (const fileInfo of fileInfos) { if (fileInfo.UseYn !== 'True') continue + // 1. 먼저 attachment가 존재하는지 확인 const existingAttachment = await db - .select({ id: documentAttachments.id }) + .select({ + id: documentAttachments.id, + fileName: documentAttachments.fileName, + fileSize: documentAttachments.fileSize, + uploadedAt: documentAttachments.uploadedAt + }) .from(documentAttachments) .where(eq(documentAttachments.fileId, fileInfo.FileId)) .limit(1) if (existingAttachment.length === 0) { + // attachment가 존재하지 않음 -> 신규 newAttachments++ } else { - updatedAttachments++ + // 2. attachment가 존재하면 변경사항이 있는지 체크 + const existing = existingAttachment[0] + const dolceUploadDate = this.convertDolceDateToDate(fileInfo.FileCreateDT) + + const hasChanges = + existing.fileName !== fileInfo.FileName || + existing.fileSize !== fileInfo.FileSize || + (dolceUploadDate && existing.uploadedAt && + dolceUploadDate.getTime() !== existing.uploadedAt.getTime()) + + if (hasChanges) { + // 변경사항이 있음 -> 업데이트 대상 + updatedAttachments++ + } + // 변경사항이 없으면 카운트하지 않음 } } } catch (error) { |
