diff options
Diffstat (limited to 'lib/evaluation/vendor-submission-service.ts')
| -rw-r--r-- | lib/evaluation/vendor-submission-service.ts | 66 |
1 files changed, 62 insertions, 4 deletions
diff --git a/lib/evaluation/vendor-submission-service.ts b/lib/evaluation/vendor-submission-service.ts index 388f382a..c06a9d2a 100644 --- a/lib/evaluation/vendor-submission-service.ts +++ b/lib/evaluation/vendor-submission-service.ts @@ -129,6 +129,7 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number): // 협력업체 정보 vendorId: vendors.id, + companyId: evaluationSubmissions.companyId, vendorCode: vendors.vendorCode, vendorName: vendors.vendorName, vendorEmail: vendors.email, @@ -149,7 +150,7 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number): } const submission = submissionResult[0] - const submissionId = submission.id // evaluationSubmissions.id (integer) + let submissionId = submission.id // evaluationSubmissions.id (integer) const submissionUuid = submission.submissionId // evaluationSubmissions.submissionId (UUID) console.log("=== 협력업체 제출 상세 조회 시작 ===") @@ -157,6 +158,58 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number): console.log("submissionUuid:", submissionUuid) console.log("submission:", submission) + // 🔍 조선/해양 동시 제출 케이스 처리: 현재 submission에 응답이 없으면 같은 그룹에서 응답이 있는 submission을 찾아서 사용 + const hasResponses = await db + .select({ count: sql<number>`COUNT(*)::int` }) + .from(generalEvaluationResponses) + .where( + and( + eq(generalEvaluationResponses.submissionId, submissionId), + eq(generalEvaluationResponses.isActive, true) + ) + ) + .then(result => (result[0]?.count || 0) > 0) + + if (!hasResponses) { + console.log("현재 submission에 응답 없음. 같은 그룹에서 응답이 있는 submission 찾기...") + + // 같은 companyId, evaluationYear, evaluationRound를 가진 다른 submission 중 응답이 있는 것을 찾음 + const siblingSubmissions = await db + .select({ + id: evaluationSubmissions.id, + submissionId: evaluationSubmissions.submissionId, + }) + .from(evaluationSubmissions) + .where( + and( + eq(evaluationSubmissions.companyId, submission.companyId), + eq(evaluationSubmissions.evaluationYear, submission.evaluationYear), + eq(evaluationSubmissions.evaluationRound, submission.evaluationRound || ""), + eq(evaluationSubmissions.isActive, true) + ) + ) + + // 각 sibling submission에 응답이 있는지 확인 + for (const sibling of siblingSubmissions) { + const siblingHasResponses = await db + .select({ count: sql<number>`COUNT(*)::int` }) + .from(generalEvaluationResponses) + .where( + and( + eq(generalEvaluationResponses.submissionId, sibling.id), + eq(generalEvaluationResponses.isActive, true) + ) + ) + .then(result => (result[0]?.count || 0) > 0) + + if (siblingHasResponses) { + console.log(`응답이 있는 submission 발견: ${sibling.id}`) + submissionId = sibling.id + break + } + } + } + // 2. 일반평가 항목과 응답 조회 const generalEvaluationsResult = await db .select({ @@ -281,7 +334,7 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number): fileSize: row.fileSize, mimeType: row.mimeType, uploadedBy: row.uploadedBy, - createdAt: new Date(row.attachmentCreatedAt) + createdAt: row.attachmentCreatedAt ? new Date(row.attachmentCreatedAt) : new Date() }) } }) @@ -324,10 +377,10 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number): // 5. 첨부파일 통계 계산 const allAttachments = generalEvaluationsResult - .filter(row => row.attachmentId) + .filter(row => row.attachmentId && row.fileSize !== null) .map(row => ({ id: row.attachmentId, - fileSize: row.fileSize + fileSize: row.fileSize || 0 })) const attachmentStats = { @@ -348,6 +401,11 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number): reviewComments: submission.reviewComments, averageEsgScore: submission.averageEsgScore ? Number(submission.averageEsgScore) : null, + // 진행률 통계 + totalGeneralItems: submission.totalGeneralItems, + completedGeneralItems: submission.completedGeneralItems, + totalEsgItems: submission.totalEsgItems, + completedEsgItems: submission.completedEsgItems, vendor: { id: submission.vendorId, |
