diff options
Diffstat (limited to 'lib/bidding/service.ts')
| -rw-r--r-- | lib/bidding/service.ts | 61 |
1 files changed, 40 insertions, 21 deletions
diff --git a/lib/bidding/service.ts b/lib/bidding/service.ts index 76cd31f7..d45e9286 100644 --- a/lib/bidding/service.ts +++ b/lib/bidding/service.ts @@ -40,7 +40,8 @@ import { import { revalidatePath } from 'next/cache' import { filterColumns } from '@/lib/filter-columns' import { GetBiddingsSchema, CreateBiddingSchema } from './validation' -import { saveFile } from '../file-stroage' +import { saveFile, saveBuffer } from '../file-stroage' +import { decryptBufferWithServerAction } from '@/components/drm/drmUtils' import { getVendorPricesForBidding } from './detail/service' import { getPrItemsForBidding } from './pre-quote/service' @@ -1913,12 +1914,14 @@ export async function updateBiddingBasicInfo( } } -// 입찰 일정 업데이트 +// 입찰 일정 업데이트 (오프셋 기반) export async function updateBiddingSchedule( biddingId: number, schedule: { - submissionStartDate?: string - submissionEndDate?: string + submissionStartOffset?: number // 시작일 오프셋 (결재 후 n일) + submissionStartTime?: string // 시작 시간 (HH:MM) + submissionDurationDays?: number // 기간 (시작일 + n일) + submissionEndTime?: string // 마감 시간 (HH:MM) remarks?: string isUrgent?: boolean hasSpecificationMeeting?: boolean @@ -1949,14 +1952,28 @@ export async function updateBiddingSchedule( return new Date(`${dateStr}:00+09:00`) } + // 시간 문자열(HH:MM)을 임시 timestamp로 변환 (1970-01-01 HH:MM:00 UTC) + // 결재 완료 시 실제 날짜로 계산됨 + const timeToTimestamp = (timeStr?: string): Date | null => { + if (!timeStr) return null + const [hours, minutes] = timeStr.split(':').map(Number) + const date = new Date(0) // 1970-01-01 00:00:00 UTC + date.setUTCHours(hours, minutes, 0, 0) + return date + } + return await db.transaction(async (tx) => { const updateData: any = { updatedAt: new Date(), updatedBy: userName, } - if (schedule.submissionStartDate !== undefined) updateData.submissionStartDate = parseDate(schedule.submissionStartDate) || null - if (schedule.submissionEndDate !== undefined) updateData.submissionEndDate = parseDate(schedule.submissionEndDate) || null + // 오프셋 기반 필드 저장 + if (schedule.submissionStartOffset !== undefined) updateData.submissionStartOffset = schedule.submissionStartOffset + if (schedule.submissionDurationDays !== undefined) updateData.submissionDurationDays = schedule.submissionDurationDays + // 시간은 timestamp 필드에 임시 저장 (1970-01-01 HH:MM:00) + if (schedule.submissionStartTime !== undefined) updateData.submissionStartDate = timeToTimestamp(schedule.submissionStartTime) + if (schedule.submissionEndTime !== undefined) updateData.submissionEndDate = timeToTimestamp(schedule.submissionEndTime) if (schedule.remarks !== undefined) updateData.remarks = schedule.remarks if (schedule.isUrgent !== undefined) updateData.isUrgent = schedule.isUrgent if (schedule.hasSpecificationMeeting !== undefined) updateData.hasSpecificationMeeting = schedule.hasSpecificationMeeting @@ -3240,32 +3257,34 @@ export async function increaseRoundOrRebid(biddingId: number, userId: string | u if (existingDocuments.length > 0) { for (const doc of existingDocuments) { try { - // 기존 파일을 Buffer로 읽어서 File 객체 생성 - const { readFileSync, existsSync } = await import('fs') + // 기존 파일 경로 확인 및 Buffer로 읽기 + const { readFile, access, constants } = await import('fs/promises') const { join } = await import('path') + // 파일 경로 정규화 const oldFilePath = doc.filePath.startsWith('/uploads/') ? join(process.cwd(), 'public', doc.filePath) + : doc.filePath.startsWith('/') + ? join(process.cwd(), 'public', doc.filePath) : doc.filePath - if (!existsSync(oldFilePath)) { - console.warn(`원본 파일이 존재하지 않음: ${oldFilePath}`) + // 파일 존재 여부 확인 + try { + await access(oldFilePath, constants.R_OK) + } catch { + console.warn(`원본 파일이 존재하지 않거나 읽을 수 없음: ${oldFilePath}`) continue } - // 파일 내용을 읽어서 Buffer 생성 - const fileBuffer = readFileSync(oldFilePath) - - // Buffer를 File 객체로 변환 (브라우저 File API 시뮬레이션) - const file = new File([fileBuffer], doc.fileName, { - type: doc.mimeType || 'application/octet-stream' - }) + // 파일 내용을 Buffer로 읽기 + const fileBuffer = await readFile(oldFilePath) - // saveFile을 사용하여 새 파일 저장 - const saveResult = await saveFile({ - file, + // saveBuffer를 사용하여 새 파일 저장 (File 객체 변환 없이 직접 저장) + const saveResult = await saveBuffer({ + buffer: fileBuffer, + fileName: doc.fileName, directory: `biddings/${newBidding.id}/attachments/${doc.documentType === 'evaluation_doc' ? 'shi' : 'vendor'}`, - originalName: `copied_${Date.now()}_${doc.fileName}`, + originalName: doc.originalFileName || doc.fileName, userId: userName }) |
