diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-10-14 05:59:11 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-10-14 05:59:11 +0000 |
| commit | dfc898b298e16bf686d2929db0eee50abe87881d (patch) | |
| tree | ac755b5ec62e1523c46e95dbad6af51b11767918 /lib/rfq-last/service.ts | |
| parent | b7069eccf7d54a9bb51c244207110c75a1d55f33 (diff) | |
(최겸) 구매 견적 첨부파일 기능 수정, 제출 후 수정x 추가 등
Diffstat (limited to 'lib/rfq-last/service.ts')
| -rw-r--r-- | lib/rfq-last/service.ts | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/lib/rfq-last/service.ts b/lib/rfq-last/service.ts index f600d04b..50a5c64c 100644 --- a/lib/rfq-last/service.ts +++ b/lib/rfq-last/service.ts @@ -934,6 +934,103 @@ export async function getRfqVendorAttachments(rfqId: number) { } } +/** + * 특정 RFQ의 특정 벤더가 제출한 모든 응답의 첨부파일 조회, 추후 협력업체가 제출한 첨부파일 히스토리 조회용으로 사용 + */ +export async function getVendorResponseAttachments(rfqId: number, vendorId: number) { + try { + if (!rfqId || rfqId <= 0 || !vendorId || vendorId <= 0) { + return { + success: false, + error: "유효하지 않은 RFQ ID 또는 벤더 ID입니다", + data: [] + } + } + + // 먼저 해당 rfq에 연결된 벤더의 모든응답들을 찾기 + const vendorResponses = await db + .select({ + id: rfqLastVendorResponses.id, + status: rfqLastVendorResponses.status, + responseVersion: rfqLastVendorResponses.responseVersion, + }) + .from(rfqLastVendorResponses) + .where( + and( + eq(rfqLastVendorResponses.rfqsLastId, rfqId), + eq(rfqLastVendorResponses.vendorId, vendorId) + ) + ) + + if (vendorResponses.length === 0) { + return { + success: true, + data: [] + } + } + + const responseIds = vendorResponses.map(r => r.id) + + // 해당 응답들의 모든 첨부파일 조회 + const data = await db + .select({ + // 첨부파일 메인 정보 + id: rfqLastVendorAttachments.id, + vendorResponseId: rfqLastVendorAttachments.vendorResponseId, + attachmentType: rfqLastVendorAttachments.attachmentType, + documentNo: rfqLastVendorAttachments.documentNo, + + // 파일 정보 + fileName: rfqLastVendorAttachments.fileName, + originalFileName: rfqLastVendorAttachments.originalFileName, + filePath: rfqLastVendorAttachments.filePath, + fileSize: rfqLastVendorAttachments.fileSize, + fileType: rfqLastVendorAttachments.fileType, + + // 파일 설명 + description: rfqLastVendorAttachments.description, + + // 유효기간 + validFrom: rfqLastVendorAttachments.validFrom, + validTo: rfqLastVendorAttachments.validTo, + + // 업로드 정보 + uploadedBy: rfqLastVendorAttachments.uploadedBy, + uploadedAt: rfqLastVendorAttachments.uploadedAt, + + // 업로더 정보 + uploadedByName: users.name, + + // 응답 정보 + responseStatus: rfqLastVendorResponses.status, + responseVersion: rfqLastVendorResponses.responseVersion, + }) + .from(rfqLastVendorAttachments) + .leftJoin( + rfqLastVendorResponses, + eq(rfqLastVendorAttachments.vendorResponseId, rfqLastVendorResponses.id) + ) + .leftJoin(users, eq(rfqLastVendorAttachments.uploadedBy, users.id)) + .where(inArray(rfqLastVendorAttachments.vendorResponseId, responseIds)) + .orderBy( + desc(rfqLastVendorAttachments.uploadedAt), + rfqLastVendorAttachments.attachmentType + ) + + return { + data, + success: true + } + } catch (err) { + console.error("getVendorResponseAttachments error:", err) + return { + data: [], + success: false, + error: "첨부파일 조회 중 오류가 발생했습니다" + } + } +} + // 벤더 추가 액션 |
