diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-11-17 08:09:08 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-11-17 08:09:08 +0000 |
| commit | 4a077640becddf65ac2dc98451c5c83aa70108f8 (patch) | |
| tree | ab5ccdb4425ab5788d248a3bf7c4d87d551989af /lib/evaluation/service.ts | |
| parent | a5c5c88e3033854b78ffc2fe73b8b6dd0502aa61 (diff) | |
(임수민) 협력업체 정기평가 수정
Diffstat (limited to 'lib/evaluation/service.ts')
| -rw-r--r-- | lib/evaluation/service.ts | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/lib/evaluation/service.ts b/lib/evaluation/service.ts index b958e371..122d0777 100644 --- a/lib/evaluation/service.ts +++ b/lib/evaluation/service.ts @@ -1283,10 +1283,91 @@ export async function getEvaluationDetails(periodicEvaluationId: number): Promis questionsWithAttachments: new Set(attachmentsData.map(att => att.criteriaId).filter(Boolean)).size, } + // 🔄 7. 조선/해양 취합 정보 계산 (동시 평가인 경우) + let consolidatedInfo: { + shipbuildingScore: number | null + shipbuildingGrade: string | null + offshoreScore: number | null + offshoreGrade: string | null + consolidatedScore: number | null + consolidatedGrade: string | null + } | undefined = undefined + + // 현재 평가의 evaluationTarget 정보 가져오기 + const currentEvaluationTarget = await db + .select({ + id: evaluationTargets.id, + vendorId: evaluationTargets.vendorId, + evaluationYear: evaluationTargets.evaluationYear, + evaluationRound: evaluationTargets.evaluationRound, + division: evaluationTargets.division, + }) + .from(evaluationTargets) + .innerJoin(periodicEvaluations, eq(periodicEvaluations.evaluationTargetId, evaluationTargets.id)) + .where(eq(periodicEvaluations.id, periodicEvaluationId)) + .limit(1) + + if (currentEvaluationTarget.length > 0) { + const target = currentEvaluationTarget[0] + + // 같은 업체, 같은 년도, 같은 라운드의 다른 division 평가가 있는지 확인 + const siblingEvaluations = await db + .select({ + periodicEvaluationId: periodicEvaluations.id, + division: evaluationTargets.division, + finalScore: periodicEvaluations.finalScore, + finalGrade: periodicEvaluations.finalGrade, + }) + .from(evaluationTargets) + .innerJoin(periodicEvaluations, eq(periodicEvaluations.evaluationTargetId, evaluationTargets.id)) + .where( + and( + eq(evaluationTargets.vendorId, target.vendorId), + eq(evaluationTargets.evaluationYear, target.evaluationYear), + eq(evaluationTargets.evaluationRound, target.evaluationRound || "") + ) + ) + + // 조선과 해양 평가가 모두 있는지 확인 + const shipbuilding = siblingEvaluations.find(e => e.division === "SHIPBUILDING") + const offshore = siblingEvaluations.find(e => e.division === "PLANT") + + if (shipbuilding && offshore) { + // 두 평가가 모두 있으면 취합 정보 계산 + const shipScore = shipbuilding.finalScore ? Number(shipbuilding.finalScore) : null + const offScore = offshore.finalScore ? Number(offshore.finalScore) : null + + let consolidatedScore: number | null = null + let consolidatedGrade: string | null = null + + // 둘 다 점수가 있으면 50% 반영하여 취합 + if (shipScore !== null && offScore !== null) { + consolidatedScore = Math.round((shipScore * 0.5 + offScore * 0.5) * 10) / 10 + + // 취합 등급 계산 (점수 기준) + if (consolidatedScore >= 90) consolidatedGrade = "S" + else if (consolidatedScore >= 80) consolidatedGrade = "A" + else if (consolidatedScore >= 70) consolidatedGrade = "B" + else if (consolidatedScore >= 60) consolidatedGrade = "C" + else consolidatedGrade = "D" + } + + consolidatedInfo = { + shipbuildingScore: shipScore, + shipbuildingGrade: shipbuilding.finalGrade, + offshoreScore: offScore, + offshoreGrade: offshore.finalGrade, + consolidatedScore, + consolidatedGrade, + } + } + } + return { evaluationInfo: evaluationInfo[0], reviewerDetails: Array.from(reviewerDetailsMap.values()), attachmentStats, + consolidatedInfo, } } catch (error) { |
