diff options
Diffstat (limited to 'lib/vendor-document-list/dolce-upload-service.ts')
| -rw-r--r-- | lib/vendor-document-list/dolce-upload-service.ts | 112 |
1 files changed, 79 insertions, 33 deletions
diff --git a/lib/vendor-document-list/dolce-upload-service.ts b/lib/vendor-document-list/dolce-upload-service.ts index 0396e819..627e0eba 100644 --- a/lib/vendor-document-list/dolce-upload-service.ts +++ b/lib/vendor-document-list/dolce-upload-service.ts @@ -110,6 +110,7 @@ class DOLCEUploadService { } // 4. 각 리비전별로 처리 + // 4. 각 리비전별로 처리 for (const revision of revisionsToUpload) { try { console.log(`Processing revision ${revision.revision} for document ${revision.documentNo}`) @@ -117,8 +118,9 @@ class DOLCEUploadService { // 4-1. 파일이 있는 경우 먼저 업로드 let uploadId: string | undefined if (revision.attachments && revision.attachments.length > 0) { - const fileUploadResults = await this.uploadFiles(revision.attachments) - + // ✅ userId를 uploadFiles 메서드에 전달 + const fileUploadResults = await this.uploadFiles(revision.attachments, userId) + if (fileUploadResults.length > 0) { uploadId = fileUploadResults[0].uploadId // 첫 번째 파일의 UploadId 사용 uploadedFiles += fileUploadResults.length @@ -128,8 +130,8 @@ class DOLCEUploadService { // 4-2. 문서 정보 업로드 const dolceDoc = this.transformToDoLCEDocument( - revision, - contractInfo, + revision, + contractInfo, uploadId, contractInfo.vendorCode, firstRevisionMap @@ -170,7 +172,6 @@ class DOLCEUploadService { console.error(errorMessage, error) } } - return { success: errors.length === 0, uploadedDocuments, @@ -223,7 +224,7 @@ class DOLCEUploadService { map.set(item.issueStageId, item.firstRevision) } }) - + return map } @@ -242,17 +243,18 @@ class DOLCEUploadService { uploaderName: revisions.uploaderName, submittedDate: revisions.submittedDate, comment: revisions.comment, - + usage: revisions.comment, + // ✅ DOLCE 연동 필드들 (새로 추가) externalUploadId: revisions.externalUploadId, externalRegisterId: revisions.id, externalSentAt: revisions.submittedDate, - + // issueStages 테이블 정보 issueStageId: issueStages.id, stageName: issueStages.stageName, documentId: issueStages.documentId, - + // documents 테이블 정보 (DOLCE 업로드에 필요한 모든 필드) documentNo: documents.docNumber, documentName: documents.title, @@ -260,7 +262,7 @@ class DOLCEUploadService { drawingMoveGbn: documents.drawingMoveGbn, discipline: documents.discipline, registerGroupId: documents.registerGroupId, - + // DOLCE B4 전용 필드들 cGbn: documents.cGbn, dGbn: documents.dGbn, @@ -268,13 +270,13 @@ class DOLCEUploadService { deptGbn: documents.deptGbn, jGbn: documents.jGbn, sGbn: documents.sGbn, - + // DOLCE 추가 정보 manager: documents.manager, managerENM: documents.managerENM, managerNo: documents.managerNo, shiDrawingNo: documents.shiDrawingNo, - + // 외부 시스템 연동 정보 externalDocumentId: documents.externalDocumentId, externalSystemType: documents.externalSystemType, @@ -312,7 +314,13 @@ class DOLCEUploadService { /** * 파일 업로드 (PWPUploadService.ashx) */ - private async uploadFiles(attachments: any[]): Promise<Array<{uploadId: string, fileId: string, filePath: string}>> { + /** + * 파일 업로드 (PWPUploadService.ashx) - DB 업데이트 포함 + */ + private async uploadFiles( + attachments: any[], + userId: string + ): Promise<Array<{ uploadId: string, fileId: string, filePath: string }>> { const uploadResults = [] for (const attachment of attachments) { @@ -339,15 +347,29 @@ class DOLCEUploadService { throw new Error(`File upload failed: HTTP ${response.status} - ${errorText}`) } - const filePath = await response.text() // DOLCE에서 반환하는 파일 경로 + const dolceFilePath = await response.text() // DOLCE에서 반환하는 파일 경로 + + // ✅ 업로드 성공 후 documentAttachments 테이블 업데이트 + await db + .update(documentAttachments) + .set({ + uploadId: uploadId, + fileId: fileId, + uploadedBy: userId, + dolceFilePath: dolceFilePath, + uploadedAt: new Date(), + updatedAt: new Date() + }) + .where(eq(documentAttachments.id, attachment.id)) uploadResults.push({ uploadId, fileId, - filePath + filePath: dolceFilePath }) - console.log(`✅ File uploaded successfully: ${attachment.fileName} -> ${filePath}`) + console.log(`✅ File uploaded successfully: ${attachment.fileName} -> ${dolceFilePath}`) + console.log(`✅ DB updated for attachment ID: ${attachment.id}`) } catch (error) { console.error(`❌ File upload failed for ${attachment.fileName}:`, error) @@ -361,7 +383,7 @@ class DOLCEUploadService { /** * 문서 정보 업로드 (DetailDwgReceiptMgmtEdit) */ - private async uploadDocument(dwgList: DOLCEDocument[], userId: string): Promise<{success: boolean, error?: string, data?: any}> { + private async uploadDocument(dwgList: DOLCEDocument[], userId: string): Promise<{ success: boolean, error?: string, data?: any }> { try { const endpoint = `${this.BASE_URL}/Services/VDCSWebService.svc/DetailDwgReceiptMgmtEdit` @@ -403,7 +425,7 @@ class DOLCEUploadService { /** * 파일 매핑 정보 업로드 (MatchBatchFileDwgEdit) */ - private async uploadFileMapping(mappingList: DOLCEFileMapping[], userId: string): Promise<{success: boolean, error?: string, data?: any}> { + private async uploadFileMapping(mappingList: DOLCEFileMapping[], userId: string): Promise<{ success: boolean, error?: string, data?: any }> { try { const endpoint = `${this.BASE_URL}/Services/VDCSWebService.svc/MatchBatchFileDwgEdit` @@ -445,7 +467,7 @@ class DOLCEUploadService { /** * 리비전 데이터를 DOLCE 문서 형태로 변환 (업데이트된 스키마 사용) */ - private transformToDoLCEDocument( + private transformToDoLCEDocument( revision: any, contractInfo: any, uploadId?: string, @@ -454,7 +476,7 @@ class DOLCEUploadService { ): DOLCEDocument { // Mode 결정: 해당 issueStageId의 첫 번째 revision인지 확인 let mode: "ADD" | "MOD" = "MOD" // 기본값은 MOD - + if (firstRevisionMap && firstRevisionMap.has(revision.issueStageId)) { const firstRevision = firstRevisionMap.get(revision.issueStageId) if (revision.revision === firstRevision) { @@ -464,12 +486,36 @@ class DOLCEUploadService { // RegisterKind 결정: stageName에 따라 설정 let registerKind = "APPC" // 기본값 + if (revision.stageName) { const stageNameLower = revision.stageName.toLowerCase() - if (stageNameLower.includes("pre")) { - registerKind = "RECP" - } else if (stageNameLower.includes("working")) { - registerKind = "RECW" + + if (revision.drawingKind === "B4") { + // B4: 기존 로직 + if (stageNameLower.includes("pre")) { + registerKind = "RECP" + } else if (stageNameLower.includes("working")) { + registerKind = "RECW" + } + } else if (revision.drawingKind === "B5") { + // B5: FMEA 관련 + if (stageNameLower.includes("pre")) { + registerKind = "FMEA-R1" + } else if (stageNameLower.includes("working")) { + registerKind = "FMEA-R2" + } + } else if (revision.drawingKind === "B3") { + // B3: WORK/APPC + if (stageNameLower.includes("work") && revision.usage.includes('Partial')) { + registerKind = "WORK-P" + } else if (stageNameLower.includes("work") && revision.usage.includes('Full')) { + registerKind = "WORK" + } else if (stageNameLower.includes("approval") && revision.usage.includes('Partial')) { + registerKind = "APPC-P" + } + else if (stageNameLower.includes("approval") && revision.usage.includes('Full')) { + registerKind = "APPC" + } } } @@ -479,7 +525,7 @@ class DOLCEUploadService { if (!isNaN(numericValue)) { return numericValue } - + // 문자인 경우 (a=1, b=2, c=3, ...) if (typeof revisionValue === 'string' && revisionValue.length === 1) { const charCode = revisionValue.toLowerCase().charCodeAt(0) @@ -487,7 +533,7 @@ class DOLCEUploadService { return charCode - 96 // a=1, b=2, c=3, ... } } - + // 기본값 return 1 } @@ -558,7 +604,7 @@ class DOLCEUploadService { private async getFileBuffer(filePath: string): Promise<ArrayBuffer> { try { console.log(`Reading file from path: ${filePath}`) - + if (filePath.startsWith('http')) { // URL인 경우 직접 다운로드 const response = await fetch(filePath) @@ -570,9 +616,9 @@ class DOLCEUploadService { // 로컬 파일 경로인 경우 const fs = await import('fs') const path = await import('path') - + let actualFilePath: string - + if (filePath.startsWith('/documents/')) { // DB에 저장된 경로 형태: "/documents/[uuid].ext" // 실제 파일 시스템 경로로 변환: "public/documents/[uuid].ext" @@ -584,16 +630,16 @@ class DOLCEUploadService { // 상대 경로인 경우 그대로 사용 actualFilePath = filePath } - + // 파일 존재 여부 확인 if (!fs.existsSync(actualFilePath)) { throw new Error(`File not found: ${actualFilePath}`) } - + // 파일 읽기 const fileBuffer = fs.readFileSync(actualFilePath) console.log(`✅ File read successfully: ${actualFilePath} (${fileBuffer.length} bytes)`) - + // Buffer를 ArrayBuffer로 변환 (타입 안전성 보장) return new ArrayBuffer(fileBuffer.length).slice(0).constructor(fileBuffer) } @@ -615,7 +661,7 @@ class DOLCEUploadService { // 업로드 성공 시 관련 날짜 설정 if (status === 'SUBMITTED') { updateData.submittedDate = new Date().toISOString().slice(0, 10) - // updateData.externalSentAt = new Date().toISOString().slice(0, 10) + // updateData.externalSentAt = new Date().toISOString().slice(0, 10) } else if (status === 'APPROVED') { updateData.approvedDate = new Date().toISOString().slice(0, 10) } |
