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