summaryrefslogtreecommitdiff
path: root/lib/evaluation/service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/evaluation/service.ts')
-rw-r--r--lib/evaluation/service.ts81
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) {