summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/vendor-document-list/import-service.ts178
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) {