페이지 수정사항 반영
This commit is contained in:
114
backend/check-data3.js
Normal file
114
backend/check-data3.js
Normal file
@@ -0,0 +1,114 @@
|
||||
const { Client } = require('pg');
|
||||
|
||||
async function main() {
|
||||
const conn = new Client({
|
||||
host: 'localhost',
|
||||
port: 5432,
|
||||
user: 'postgres',
|
||||
password: 'turbo123',
|
||||
database: 'genome_db'
|
||||
});
|
||||
await conn.connect();
|
||||
|
||||
const farmNo = 1;
|
||||
const cowId = 'KOR002191643715';
|
||||
|
||||
console.log('=======================================================');
|
||||
console.log('대시보드 vs 개체상세 차트 비교');
|
||||
console.log('=======================================================\n');
|
||||
|
||||
// =====================================================
|
||||
// 1. 대시보드: getFarmRegionRanking API
|
||||
// - 농가 평균 = 농가 내 개체들의 선발지수 평균
|
||||
// - 보은군 평균 = 전체 개체들의 선발지수 평균
|
||||
// =====================================================
|
||||
console.log('=== 1. 대시보드 (getFarmRegionRanking) ===');
|
||||
console.log('보은군 내 농가 위치 차트\n');
|
||||
|
||||
// 모든 개체별 선발지수 (35개 형질 EBV 합계)
|
||||
const allCowsResult = await conn.query(`
|
||||
SELECT c.cow_id, gr.fk_farm_no, SUM(gtd.trait_ebv) as total_ebv
|
||||
FROM tb_genome_request gr
|
||||
JOIN tb_cow c ON gr.fk_cow_no = c.pk_cow_no
|
||||
JOIN tb_genome_trait_detail gtd ON gtd.cow_id = c.cow_id AND gtd.del_dt IS NULL
|
||||
WHERE gr.del_dt IS NULL AND c.del_dt IS NULL
|
||||
AND gr.chip_sire_name = '일치'
|
||||
GROUP BY c.cow_id, gr.fk_farm_no
|
||||
HAVING COUNT(*) = 35
|
||||
`);
|
||||
const allCows = allCowsResult.rows;
|
||||
|
||||
// 농가별 평균 계산
|
||||
const farmScoresMap = new Map();
|
||||
for (const cow of allCows) {
|
||||
const fNo = cow.fk_farm_no;
|
||||
if (!farmScoresMap.has(fNo)) {
|
||||
farmScoresMap.set(fNo, []);
|
||||
}
|
||||
farmScoresMap.set(fNo, [...farmScoresMap.get(fNo), Number(cow.total_ebv)]);
|
||||
}
|
||||
|
||||
// 농가별 평균
|
||||
const farmAverages = [];
|
||||
for (const [fNo, scores] of farmScoresMap.entries()) {
|
||||
const avg = scores.reduce((a, b) => a + b, 0) / scores.length;
|
||||
farmAverages.push({ farmNo: fNo, avgScore: avg, cowCount: scores.length });
|
||||
}
|
||||
farmAverages.sort((a, b) => b.avgScore - a.avgScore);
|
||||
|
||||
// 보은군 전체 평균 (개체별 합계의 평균)
|
||||
const regionAvgScore_dashboard = allCows.reduce((sum, c) => sum + Number(c.total_ebv), 0) / allCows.length;
|
||||
|
||||
// 농가 1번 평균
|
||||
const myFarm = farmAverages.find(f => f.farmNo === farmNo);
|
||||
const farmAvgScore_dashboard = myFarm?.avgScore || 0;
|
||||
|
||||
console.log('농가 평균 (개체 선발지수 평균):', farmAvgScore_dashboard.toFixed(2));
|
||||
console.log('보은군 평균 (개체 선발지수 평균):', regionAvgScore_dashboard.toFixed(2));
|
||||
console.log('차이 (농가 - 보은군):', (farmAvgScore_dashboard - regionAvgScore_dashboard).toFixed(2));
|
||||
|
||||
// =====================================================
|
||||
// 2. 개체 상세: getSelectionIndex API
|
||||
// - 내 개체 = 개체의 선발지수 (35개 형질 EBV 합계)
|
||||
// - 농가 평균 = 같은 농가 개체들의 선발지수 평균
|
||||
// - 보은군 평균 = 전체 개체들의 선발지수 평균
|
||||
// =====================================================
|
||||
console.log('\n=== 2. 개체 상세 (getSelectionIndex) ===');
|
||||
console.log('농가 및 보은군 내 개체 위치 차트\n');
|
||||
|
||||
// 내 개체 선발지수
|
||||
const myCow = allCows.find(c => c.cow_id === cowId);
|
||||
const myScore = myCow ? Number(myCow.total_ebv) : 0;
|
||||
|
||||
// 같은 농가 개체들의 평균
|
||||
const farmCows = allCows.filter(c => c.fk_farm_no === farmNo);
|
||||
const farmAvgScore_detail = farmCows.reduce((sum, c) => sum + Number(c.total_ebv), 0) / farmCows.length;
|
||||
|
||||
// 보은군 전체 평균
|
||||
const regionAvgScore_detail = regionAvgScore_dashboard; // 동일
|
||||
|
||||
console.log('내 개체 선발지수:', myScore.toFixed(2));
|
||||
console.log('농가 평균:', farmAvgScore_detail.toFixed(2));
|
||||
console.log('보은군 평균:', regionAvgScore_detail.toFixed(2));
|
||||
console.log('');
|
||||
console.log('내 개체 vs 농가평균:', (myScore - farmAvgScore_detail).toFixed(2));
|
||||
console.log('내 개체 vs 보은군평균:', (myScore - regionAvgScore_detail).toFixed(2));
|
||||
|
||||
// =====================================================
|
||||
// 3. 비교 요약
|
||||
// =====================================================
|
||||
console.log('\n=======================================================');
|
||||
console.log('비교 요약');
|
||||
console.log('=======================================================');
|
||||
console.log('');
|
||||
console.log('[대시보드] 농가 vs 보은군 차이:', (farmAvgScore_dashboard - regionAvgScore_dashboard).toFixed(2));
|
||||
console.log('[개체상세] 개체 vs 농가 차이:', (myScore - farmAvgScore_detail).toFixed(2));
|
||||
console.log('[개체상세] 개체 vs 보은군 차이:', (myScore - regionAvgScore_detail).toFixed(2));
|
||||
console.log('');
|
||||
console.log('=> 대시보드는 농가평균 vs 보은군평균 비교 (차이 작음)');
|
||||
console.log('=> 개체상세는 개별개체 vs 평균 비교 (개체가 우수하면 차이 큼)');
|
||||
|
||||
await conn.end();
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
Reference in New Issue
Block a user