필터 UI 수정 및 대시보드 연동

This commit is contained in:
2025-12-11 11:21:07 +09:00
parent 886aa9abd9
commit a673fd9429
5 changed files with 430 additions and 140 deletions

View File

@@ -552,14 +552,22 @@ export class GenomeService {
farms.sort((a, b) => b.avgEbv - a.avgEbv);
}
// 형질별 평균 및 순위 계산
// 형질별 평균 및 순위 계산 (표준 경쟁 순위 방식: 동률 시 같은 순위, 다음 순위 건너뜀)
const traitAverages = Array.from(traitDataMap.entries()).map(([traitName, data]) => {
const avgEbv = Math.round((data.sum / data.count) * 100) / 100;
const avgEpd = Math.round((data.epdSum / data.count) * 100) / 100; // 육종가(EPD) 평균
const rankings = traitRankingMap.get(traitName) || [];
const totalFarms = rankings.length;
const rankIndex = rankings.findIndex(r => r.farmNo === farmNo);
const rank = rankIndex >= 0 ? rankIndex + 1 : null;
// 표준 경쟁 순위 계산: 동률 처리
let rank: number | null = null;
const farmData = rankings.find(r => r.farmNo === farmNo);
if (farmData) {
// 나보다 높은 점수를 가진 농장 수 + 1 = 내 순위
const higherCount = rankings.filter(r => r.avgEbv > farmData.avgEbv).length;
rank = higherCount + 1;
}
const percentile = rank !== null && totalFarms > 0 ? Math.round((rank / totalFarms) * 100) : null;
return {
@@ -1793,9 +1801,14 @@ export class GenomeService {
// 내림차순 정렬
farmAverages.sort((a, b) => b.avgScore - a.avgScore);
// 8. 현재 농가 순위 찾기
const myFarmIndex = farmAverages.findIndex(f => f.farmNo === farmNo);
// 8. 현재 농가 순위 찾기 (표준 경쟁 순위: 동률 시 같은 순위)
const myFarmData = farmAverages.find(f => f.farmNo === farmNo);
let farmRankInRegion: number | null = null;
if (myFarmData) {
// 나보다 높은 점수를 가진 농장 수 + 1 = 내 순위
const higherCount = farmAverages.filter(f => f.avgScore > myFarmData.avgScore).length;
farmRankInRegion = higherCount + 1;
}
// 9. 보은군 전체 평균
const regionAvgScore = allScores.length > 0
@@ -1807,10 +1820,10 @@ export class GenomeService {
farmerName: farm.farmerName || null,
farmAvgScore: myFarmData?.avgScore ?? null,
regionAvgScore,
farmRankInRegion: myFarmIndex >= 0 ? myFarmIndex + 1 : null,
farmRankInRegion,
totalFarmsInRegion: farmAverages.length,
percentile: myFarmIndex >= 0 && farmAverages.length > 0
? Math.round(((myFarmIndex + 1) / farmAverages.length) * 100)
percentile: farmRankInRegion !== null && farmAverages.length > 0
? Math.round((farmRankInRegion / farmAverages.length) * 100)
: null,
farmCowCount: myFarmData?.cowCount || 0,
regionCowCount: allScores.length,