diff options
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) { |
