UI 수정:화면 수정

This commit is contained in:
2025-12-11 20:07:19 +09:00
parent b906ec1851
commit 7d15c9be7c
26 changed files with 2629 additions and 557 deletions

View File

@@ -1322,13 +1322,18 @@ export class GenomeService {
};
}
// Step 4: 가중 평균 계산
// Step 4: 가중 평균 계산 ================================================================================
let weightedSum = 0; // Σ(EBV × 가중치)
let totalWeight = 0; // Σ(가중치)
let percentileSum = 0; // 백분위 합계 (평균 계산용)
let percentileCount = 0; // 백분위 개수
let hasAllTraits = true; // 모든 선택 형질 존재 여부 (리스트와 동일 로직)
const details: { traitNm: string; ebv: number; weight: number; contribution: number }[] = [];
const details: {
traitNm: string;
ebv: number;
weight: number;
contribution: number
}[] = [];
for (const condition of traitConditions) {
const trait = traitDetails.find((d) => d.traitName === condition.traitNm);
@@ -1359,8 +1364,8 @@ export class GenomeService {
}
}
// Step 6: 최종 점수 계산 (모든 선택 형질이 있어야만 계산)
const score = (hasAllTraits && totalWeight > 0) ? weightedSum / totalWeight : null;
// Step 6: 최종 점수 계산 (모든 선택 형질이 있어야만 계산) ================================================================
const score = (hasAllTraits && totalWeight > 0) ? weightedSum : null;
const percentile = percentileCount > 0 ? percentileSum / percentileCount : null;
// Step 7: 현재 개체의 농장/지역 정보 조회
@@ -1482,7 +1487,7 @@ export class GenomeService {
// 모든 선택 형질이 있는 경우만 점수에 포함
if (hasAllTraits && totalWeight > 0) {
const score = weightedSum / totalWeight;
const score = weightedSum;
allScores.push({
cowId: request.cow.cowId,
score: Math.round(score * 100) / 100,
@@ -1494,6 +1499,7 @@ export class GenomeService {
// 점수 기준 내림차순 정렬
allScores.sort((a, b) => b.score - a.score);
console.log('[calculateRanks] 샘플 점수:', allScores.slice(0, 5).map(s => ({ cowId: s.cowId, score: s.score })));
// 농가 순위 및 평균 선발지수 계산
let farmRank: number | null = null;
@@ -1667,7 +1673,10 @@ export class GenomeService {
* 성능 최적화: N+1 쿼리 문제 해결 - 모든 데이터를 한 번에 조회 후 메모리에서 처리
* @param farmNo - 농장 번호
*/
async getFarmRegionRanking(farmNo: number): Promise<{
async getFarmRegionRanking(
farmNo: number,
inputTraitConditions?: { traitNm: string; weight?: number }[]
): Promise<{
farmNo: number;
farmerName: string | null;
farmAvgScore: number | null;
@@ -1728,7 +1737,12 @@ export class GenomeService {
'안심rate', '등심rate', '채끝rate', '목심rate', '앞다리rate',
'우둔rate', '설도rate', '사태rate', '양지rate', '갈비rate',
];
const traitConditions = ALL_TRAITS.map(traitNm => ({ traitNm, weight: 1 }));
// inputTraitConditions가 있으면 사용, 없으면 35개 형질 기본값 사용
const traitConditions = inputTraitConditions && inputTraitConditions.length > 0
? inputTraitConditions
: ALL_TRAITS.map(traitNm => ({ traitNm, weight: 1 }));
console.log('[getFarmRegionRanking] traitConditions:', traitConditions.length, 'traits');
// 5. 각 개체별 점수 계산 (메모리에서 처리 - DB 쿼리 없음)
const allScores: { cowId: string; score: number; farmNo: number | null }[] = [];
@@ -1758,7 +1772,7 @@ export class GenomeService {
}
if (hasAllTraits && totalWeight > 0) {
const score = weightedSum / totalWeight;
const score = weightedSum;
allScores.push({
cowId: request.cow.cowId,
score: Math.round(score * 100) / 100,
@@ -1815,6 +1829,14 @@ export class GenomeService {
? Math.round((allScores.reduce((sum, s) => sum + s.score, 0) / allScores.length) * 100) / 100
: null;
// 디버깅: 상위 5개 농가 점수 출력
console.log('[getFarmRegionRanking] 결과:', {
myFarmRank: farmRankInRegion,
myFarmScore: myFarmData?.avgScore,
totalFarms: farmAverages.length,
top5: farmAverages.slice(0, 5).map(f => ({ farmNo: f.farmNo, score: f.avgScore }))
});
return {
farmNo,
farmerName: farm.farmerName || null,